2017-01-03 12 views
2

これらの2つの方法の実際的な違いは何ですか?これらを使用するという点で非同期メソッド - 待機中とタスクを返す間の差

public static Task DoSomething() 
    { 
     return FooAsync(); 
    } 

    public static async Task DoSomethingAsync() 
    { 
     await FooAsync(); 
    } 
+2

[...ここで開始するには良い場所である](https://msdn.microsoft.com/en-us/library/mt674882.aspx) –

+0

。 OPは、どちらかを使用するかどうかを尋ねるのではなく、その違いは何か、そしてその答えはリンクされた質問の答えとは大きく異なります。 – Bauss

答えて

2

実用的な違いではありません:何も。どちらも「待つ」。

生成されるコードに若干の違いがありますが、非同期バージョンは状態マシーンになります。本当に心配するものではありません。

これらのメソッドは他に何もしないので、他のものよりも優先させるのは難しいからです。最初の(最も単純な)ものが行います。

0

awaitは、タスクが完了して結果を返すまで実際に待機します。あなたがタスクを返すとき、それは将来完了するタスクへのハンドルを返すので、結果を得るためのタスクを待っています。

+0

'await'を使うメソッドは、とにかくTaskを返すので、あなたはまだ待っていなければなりません。 –

+0

' FwaAsync() 'が終了するまで待たずに、呼び出し元に即座に戻ります。 'FooAsync()'によって返されたものはまだ完成していません)。その内部タスクが完了すると、 'DoSomethingAsync()'は最終的に 'await'の後に再開します...再開するものがないので違いはありません。それは単にコンパイラオーバーヘッドです。 –

+0

はい私はそれが制御を放棄することに同意しますが、それは結果を待つことを待っています。私はそれを同期させることを待っているわけではありません。 –

0

DoSomething()は、発信者からの質問があった場合に実行されます。 await DoSomething();を実行すると実行されます。しかし、あなたが変数にタスクを保存し、後でそれを実行することができます。DoSomethingAsync

var task = DoSomething(); 
// Do stuff 
await task(); 

を呼び出したときに、それが実行されます。非同期なので重複が間違っているとしてこれをマーク誰

+0

はい、1つは非同期です。しかし、どちらも「遅延実行」を持っていますが、FooAsync()が呼び出される時期や方法はまったく異なりません。 –

関連する問題