質問

私はに新しいでした async-await メソッドで C# 5.0, そして、私は私の心の中でいくつかの質問を持っています

  1. 脱出する最良の方法は何ですか async 入力引数またはnullチェックに失敗した場合のメソッド?

  2. 使用の論理的な流れは何ですか return; タスクの中で async 方法(いくつかの状況では、それは無限ループになりました)?

  3. 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によって答えます。そのようにして、入力引数例外は、メソッドによって返されたタスクの外側にまっすぐにスローされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top