2016-09-13 11 views
-3

この2つの非同期メソッドの違いは何ですか?そうでない場合、どのような状況でこの2つの方法が異なる可能性がありますか?これら2つの非同期メソッドの違いは何ですか?

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

public async Task<int> MyMethod1Async() 
{ 
    return 1; 
} 

public async Task<int> MyMethod2Async() 
{ 
    return await new Task<int>(() => 1); 
} 
+2

非同期コードはありませんので、最初は非同期ではありません.... –

+2

async/awaitの動作についての根本的な質問は貴重ですが、この単純化されたフォームは欠陥がある。例の1つが非同期ではないので、重複した質問を指すことさえ困難です。 – Guvante

+0

実際にMyMethod2Asyncでタスクをいつ実行しますか?新しいタスクを作成するだけです。 – EJoshuaS

答えて

1

二つの方法を見て撮影:何もそれに演算子を「待つ」が存在しないので、これは同期的に実行されます

public async Task<int> MyMethod1Async() 
{ 
    return 1; 
} 

を - それはちょうど1を返すので、それはあなただけで行っていた場合よりも異なるませんが、次

public int MyMethod1() 
{ 
    return 1; 
} 

以下の方法は、おそらく非同期の異なる「タイプ」の違いをより良く示す図である。

public async Task<string> MyMethod1Async() 
    { 
     using (HttpClient client = new HttpClient()) 
     { 
      client.BaseAddress = new Uri("SomeBaseAddress"); 

      // This will return control to the method's caller until this gets a result from the server 
      HttpResponseMessage message = await client.GetAsync("SomeURI"); 

      // The same as above - returns control to the method's caller until this is done 
      string content = await message.Content.ReadAsStringAsync(); 

      return content; 
     } 
    } 

このようなコードでは、必ずしも余分なスレッドが生成されるわけではありません(マイクロソフトが特定のライブラリ呼び出しを実装した場合を除きます)。いずれにせよ、/ asyncはではありません。ではスレッドを追加する必要があります。同じスレッドで非同期に実行できます。

この事実の私の標準的なイラストは、次のとおりです。あなたが10人のレストランを持つとします。ウェイターが来たら、彼が注文した最初の人は準備ができていません。しかし、他の9人はそうです。このように、ウェイターは他の9人に注文を依頼し、元の人に戻って来て、注文する準備が整うことを期待します。 (それは間違いなく、元の人が注文する準備ができているのを待つために2番目のウェイターを手に入れてしまうので、とにかく時間を節約することはできません)。これは、多くの場合、async/awaitがどのように動作するかを示しています(Thread.Run(...)のようなTask Parallelライブラリ呼び出しの一部は実際にはです)。は他のスレッドで実行しています。 - どのドキュメントがどのドキュメントであるかを確認してください。

あなたがリストの次の項目は、あなただけのタスクを作成するので、あなたが実際にそれで何もしない動作しません

public async Task<int> MyMethod2Async() 
{ 
    return await new Task<int>(() => 1); 
} 

私はあなたが実際のような何かをすることを目的と仮定しています次

public async Task<int> MyMethod2Async() 
{ 
    return await Task.Run<int>(() => 1); 
} 

これは、スレッドプールにラムダ式を実行するラムダ式が結果を持ってまで、MyMethod2Asyncの呼び出し元に制御を戻し、その後、それは結果を持っていたら、ラムダ式から値を返します。

要約すると、違いは、あなたが同じスレッドで非同期で実行しているかどうかです(ウェイターに他の人が注文した後に戻って来るようにテーブルの最初の人に相当)か、タスクを別のスレッドで実行します。

多くのことを単純化しすぎる危険性があるため、CPUバインドタスクは通常、バックグラウンドスレッドで非同期に実行する必要があります。しかし、IOバインドされたタスク(または、ホールドアップがほとんど外部システムから何らかの結果を待っている他の場合)は、しばしば同じスレッド上で非同期に実行することができます。同じスレッド上で非同期に行うのではなく、バックグラウンドスレッドに置くことでパフォーマンスの向上は必ずしもあまりありません。

+0

気をつけて説明してください。 – EJoshuaS

1

第一の方法は、1Resultと既に完了したタスクを返します。

2番目の方法は、完了しないTask<int>を返します。

関連する問題