5

実行に時間がかかるメソッドがあります。DB を呼び出し、特定の計算を同期的に行います。

public static MyResult MyMethod(int param1, int param2)
{
    // run a DB query, wait for result, make calculations...
    ...
}

「await」キーワードを使用して WinForms UI から使用できるように、ラッパーを作成したいと考えています。これを行うために、別のメソッド MyResultAsync を作成します。正確にどのように書くか、私には選択肢があります:

// option 1
public async static Task<MyResult> MyResultAsync(int param1, int param2)
{
    return await TaskEx.Run(() => MyMethod(param1, param2));
}

// option 2
public static Task<MyResult> MyResultAsync(int param1, int param2)
{
    return TaskEx.Run(() => MyMethod(param1, param2));
}

では、どのオプションが望ましいのでしょうか?またその理由は? ご覧のとおり、違いは「async」キーワードと「await」キーワードの有無だけです。

ありがとうございました!

4

2 に答える 2

8

2 番目のオプションを使用します。

最初のオプションは を作成し、次にそれをラップTask<MyResult>する別のオプションを作成します。Task<MyResult>ラッピングは何の価値も追加しません。ただのオーバーヘッドです。

Stephen Toub は BUILD からThe Zen of Async: Best Practices for Best Performanceという素晴らしいビデオを公開しており、async/awaitオーバーヘッドと代替案について説明しています。

于 2011-11-22T16:43:53.063 に答える
4

非同期が実際にどのように機能するかがすべてです。http://msdn.microsoft.com/en-us/magazine/hh456402.aspx、特にhttp://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229662を読んだ場合。 aspxを実行すると、async キーワードにより、コンパイラがコード内にステートマシンを構築することがわかります。これはオーバーヘッドであり、パフォーマンス上の理由から、指定されたコードではまったく必要ないため、パフォーマンスが低下します。

読みやすさについては、本当に違いが生じる場合にのみ async を使用する必要があります。私にとって async とは、特定のメソッドが複数のステップで非同期的に終了することを意味します。上記のような単純なプロキシ メソッドを定義する場合、構文をこれ以上複雑にしたくはありません。

于 2011-11-22T05:59:48.680 に答える