19

async-awaitの方法を初めて知ったC# 5.0ので、いくつか質問があります。

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

  2. return;Taskメソッドで使用する論理的な流れは何ですか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);
}
4

3 に答える 3

15

私見で「何らかの問題で失敗する」ための最良の方法は、適切な例外をスローすることですreturn;、例外を回避したい場合は間違いなく使用できます。

これにより、同期的に完了した完了/失敗したタスクが作成されるため、使用している呼び出し元は完了したawaitタスクを取得し、同じスレッドを使用し続けます。


  • CancellationToken呼び出し元が操作をキャンセルできるようにしますが、これはあなたが説明しているケースではありません。

  • Task.Yield操作を終了しません。他のタスクをしばらく実行できるようにし、後で自分自身を再スケジュールします。

于 2014-07-31T09:52:19.113 に答える
0

メソッドから例外をスローすると、タスクにキャプチャされるため、 、 を呼び出してタスクを待機するか、タスクのプロパティにアクセスすることasyncによってタスクが監視されるまで、例外はスローされません。Task.Wait()Task.ResultExceptions

入力引数に関して、これを回避する 1 つの方法は、メソッドを 2 つの部分に分割することです。最初の部分は入力引数をチェックし、次に 2 番目のメソッドを呼び出しますasync例については、Stephen Cleary によるこの質問への回答を参照してください。そうすれば、入力引数の例外は、メソッドによって返されるタスクの外ですぐにスローされます。

于 2014-07-31T10:19:36.143 に答える