4

Add1()メソッドとはどう違いAdd2()ますか?違いはありますか?私が知っているすべての使用法(方法で示されているようにUsageTest())は同じです。

private async Task<int> Add1(int a, int b)
{
    return await Task.Run(
        () =>
            {
                Thread.Sleep(1000);
                return a + b;
            });
}

private Task<int> Add2(int a, int b)
{
    return Task.Run(
        () =>
            {
                Thread.Sleep(1000);
                return a + b;
            });
}

private async void UsageTest()
{
    int a = await Add1(1, 2);
    int b = await Add2(1, 3);
}
4

2 に答える 2

6

意味的には、それらは実質的に同等です。

主な違いは、 (ステート マシンの)Add1オーバーヘッドが大きいことです。async

小さな違いもあります。Add1元のコンテキストにマーシャリングしますが、そうしAdd2ません。呼び出し元のコードが以下を使用しない場合、これによりデッドロックが発生する可能性がありますawait

public void Button1_Click(..)
{
  Add1().Wait(); // deadlocks
  Add2().Wait(); // does not deadlock
}

このデッドロックの状況については、ブログ最近の MSDN の記事で詳しく説明しています。

于 2013-06-07T15:43:07.517 に答える
1

Add1 は、await キーワードに遭遇するまで同期的に実行されます。この場合、 await キーワードがメソッドの先頭にあるため、効果はありません。

この効果を確認するには、Thread.Sleep() メソッドを Add1 と Add2 の先頭に挿入し、メソッドが戻る前に非同期ブロックをマークしていることに注目してください。

于 2013-06-07T15:37:02.023 に答える