"Return"でC#非同期メソッドを終了または終了する
-
21-12-2019 - |
質問
私はに新しいでした async-await
メソッドで C# 5.0
, そして、私は私の心の中でいくつかの質問を持っています
脱出する最良の方法は何ですか
async
入力引数またはnullチェックに失敗した場合のメソッド?使用の論理的な流れは何ですか
return;
タスクの中でasync
方法(いくつかの状況では、それは無限ループになりました)?は
CancellationToken
またはTask.Yield
このシナリオでは、より良いフィット?
public Func<AzureBlobInfo, string, Task> UploadSuccessCallBackAsync { get; set; }
private async Task OnUploadSuccessAsync(AzureBlobInfo info)
{
if (this.UploadSuccessCallBackAsync == null)
{
return;
}
var transactionType = this.FormData.Get("transactionType");
if (string.IsNullOrEmpty(transactionType))
{
transactionType = "unknown";
}
await this.UploadSuccessCallBackAsync(info, transactionType);
}
解決
IMHO"いくつかの問題に失敗する"最善の方法は、適切な例外をスローすることです, しかし、 あなたは間違いなくただ使うことができます return;
例外を避けることを好む場合。
これにより、同期的に完了した完了/フォールトされたタスクが作成されるため、呼び出し元は次を使用します await
終了したタスクを取得し、同じスレッドを使用し続けます。
CancellationToken
のために可能にします 呼び出し元 操作をキャンセルするには、説明しているケースではありません。Task.Yield
操作を終了せず、他のタスクをしばらく実行できるようにし、後で自分自身を再スケジュールします。
他のヒント
任意の瞬間には、非同期方式から安全に返却できます。ご使用の場合(タスクを返す方法)コンパイラは終了タスクを生成します。そのため、機能を待っている呼び出し元は続行されます。
async
メソッドから例外を投げる場合、それはタスク内でキャプチャされるので、Task.Wait()
、Task.Result
を呼び出し、タスクの待機中またはタスクのExceptions
プロパティにアクセスすることによってタスクが観察されるまでスローされません。
メソッドを2つの部分に分割することであることを回避する1つの方法は、最初に入力引数をチェックしてから、async
である2番目のメソッドを呼び出します。このこの例では、Stephen Clearyによって答えます。そのようにして、入力引数例外は、メソッドによって返されたタスクの外側にまっすぐにスローされます。