はじめに
この記事は下記記事の続きです
【Unity】UniTaskのキャンセル処理(その1)
Try-Catch-Finallyを使用する
前回の記事から少し変えたソース(下記)で同様の操作をします
主な変更はTry-Catch-Finally
で囲みログを追加
、Catch内のReturn値
です
1、Aキーを押すだけ
2、Aキーを押した直後にZキーを押して5秒くらい待機
それぞれどのようなログが出るでしょうか?
test.cs
public class UniTaskTest1 : MonoBehaviour
{
private CancellationTokenSource cancelTonkenSource = new CancellationTokenSource();
private void Update()
{
if(Input.GetKeyDown(KeyCode.A))
{
this.cancelTonkenSource = new CancellationTokenSource();
this.MainProcess(this.cancelTonkenSource.Token).Forget();
}
else if (Input.GetKeyDown(KeyCode.Z))
{
this.cancelTonkenSource?.Cancel();
}
}
private async UniTask MainProcess(CancellationToken cancelToken)
{
try
{
var val = await this.Process1(cancelToken);
Debug.Log("結果:" + val);
}
catch(OperationCanceledException e)
{
Debug.Log("MainProcess catch");
}
finally
{
Debug.Log("MainProcess finally");
}
}
private async UniTask<int> Process1(CancellationToken cancelToken)
{
try
{
Debug.Log("開始");
int result = -1;
await UniTask.Delay(TimeSpan.FromSeconds(3f), cancellationToken: cancelToken);
Debug.Log("待機終了");
result = 1;
if (cancelToken.IsCancellationRequested)
{
Debug.Log("キャンセル2");
return result;
}
result = 2;
return result;
}
catch (OperationCanceledException e)
{
Debug.Log("Process1 catch");
return 99;
}
finally
{
Debug.Log("Process1 finally");
}
}
}
正解
まとめ
重要なのは2の操作時なので2を見てみます。
どうやらキャンセルは例外
を出しているようです。
if (cancelToken.IsCancellationRequested)
ではなくTry-Catch
でキャンセルの監視をしたほうがよさそうです。
Try-Catchで囲み、キャンセル時にしたい処理はCatch内に書く、キャンセルしてもしなくても最後に行いたい処理はfinally内に書くのがよさそうですね。
でも気になる・・。
なんでMainProcess側のCatch内のログは出てないの?
呼び出したProcess1で例外出たんだよ?
続きは次の記事で。
次の記事(続き)
【Unity】UniTaskのキャンセル処理(その3)