13

タスクベースの非同期パターン スタイル メソッドを提供したいと考えています。メソッドを待っているとき、メソッドを提供する次の 2 つの方法に違いは見つかりませんでした。

// GetStats is a delegate for a void method in this example
public Task GetStatsAsync()
{
    return Task.Run(GetStats);
}

public async Task GetStatsAsync()
{
    return await Task.Run(GetStats);
}

// Usage:
await GetStatsAsync();
// Difference?

上の方法は、下の方法よりもオーバーヘッドが少ないようです。MSDN のブログを見ていると、下の方法を使用しているように見えます。(たとえば、この記事では)

なんで?違いは正確には何ですか?どちらも機能しているようです。

4

2 に答える 2

12

どちらも論理的には同じですが、2 番目のものはオーバーヘッドが大きく、そのため推奨されません。

私のasyncイントロと、タスク ベースの非同期パターンのドキュメントが役立つかもしれません。

のオーバーヘッドの詳細については、 Stephen Toub による Zen of Asyncasyncをお勧めします。

おそらく、 「同期メソッドの非同期ラッパーを公開する必要がありますか?」も読みたいと思うでしょう。要するに、答えは「いいえ」です。

于 2012-08-14T12:37:20.730 に答える
4

TAP パターンを実装する適切な方法は次のようになるという印象を受けました。

  public Task<IResult> GetLongWindedTaskResult(){
          var tcs = new TaskCompletionSource<IResult>();
            try
            {
               tcs.SetResult(ResultOFSomeFunction());
            }
            catch (Exception exp)
            {
                tcs.SetException(exp);
            }
            return tcs.Task;
}

この方法により、スローされた場合に例外を正しく取得できるようになり、必要に応じてキャンセル メソッドを実装しやすくなります。

于 2016-08-17T18:45:17.573 に答える