前提・実現したいこと
いつも勉強させていただいております。 下記の問題がどうしても理解できません。
ご教授のほどよろしくお願い致します。
Unity 2017.1 上でC#で作業しております。
新規シーンで、Emptyオブジェクトに下記のスクリプトをコンポーネントとして
登録していただければ動作します。
Editor上での動作を想定しており、Editor実行時にConsole画面に"loop!"という
文字列が一気にwhile文で表示されSpaceキーを押すと止まります。
Taskを無限ループさせ、必要がなくなったらキャンセルできるような処理を実現したいのですが
Delayを入れてみたところ挙動が変わってしまいその理由が分からず困惑しています。
発生している問題・エラーメッセージ
ソースコード上の 「■■■■■■■■■■■■■■■■■■■■here■■■■■■■■■■■■■■■■■■■■」の2箇所の行のコメントアウトを外すと、 「□□□□□□□□□□□□□□□□□□question□□□□□□□□□□□□□□□□□□」のDebug.Logの文字「catch exception!」 が表示されなくなります。エラーがキャッチできていないようなのですが、 1.なぜエラーがキャッチできないのか 2.なぜ2箇所のコメントアウトを外しただけで処理が変わってしまうのか 3.エラーがキャッチできていないのになぜループ自体は止まるのか が理解できません。 具体的には、上記2箇所のコメントアウトがあると loop! loop! loop! catch exception! fin! 無いと loop! loop! loop! fin! となります。
該当のソースコード
C#
1using System; 2using UnityEngine; 3using System.Threading; 4using System.Threading.Tasks; 5 6public class NewBehaviourScript : MonoBehaviour { 7 8 CancellationTokenSource _tokenSource; 9 CancellationToken _token; 10 Task _cancel_key; 11 Action temp; 12 bool flag = true; 13 14 void Start () 15 { 16 _tokenSource = new CancellationTokenSource(); 17 _token = _tokenSource.Token; 18 temp = SampleFunc(); 19 20 _cancel_key = Task.Run(temp, _token); 21 22 } 23 24 private void Update() 25 { 26 if (Input.GetKey(KeyCode.Space)) 27 { 28 //複数回click防止フラグ 29 if (flag) 30 { 31 Cancel(); 32 flag = false; 33 } 34 } 35 } 36 37 public void Cancel() 38 { 39 _tokenSource.Cancel(); 40 try 41 { 42 _cancel_key.Wait(); 43 } 44 catch 45 { 46 Debug.Log("catch exception!"); //□□□□□□□□□□□□□□□□□□question□□□□□□□□□□□□□□□□□□ 47 } 48 49 _tokenSource.Dispose(); 50 Debug.Log("fin"); 51 } 52 53 54 private Action SampleFunc() 55 { 56 Action action = /*async*/ () => //■■■■■■■■■■■■■■■■■■■■here■■■■■■■■■■■■■■■■■■■■ 57 { 58 while (true) 59 { 60 Debug.Log("loop!"); 61 //await Task.Delay(1000); //■■■■■■■■■■■■■■■■■■■■here■■■■■■■■■■■■■■■■■■■■ 62 63 _token.ThrowIfCancellationRequested(); 64 65 } 66 }; 67 return action; 68 } 69}
補足情報(FW/ツールのバージョンなど)
C# .Net4.6
Unity 2017.1.0f3
新規シーンで、Emptyオブジェクトに上記のスクリプトをコンポーネントとして
登録していただければ動作します。
Editor上での動作を想定しており、Editor実行時にConsole画面に"loop!"という
文字列が一気にwhile文で表示されSpaceキーを押すと止まります。
UnityというよりはC#の書き方の問題だと思います。
私のC#のTask周りの知識が怪しく分かりにくいサンプルで申し訳ありません。
おそらく根本的な箇所を勘違いしてしまっていると思いますのでご指摘いただけるとありがたいです。
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/12 05:06