2012-12-03 8 views
7

可能性の重複:
Why does the async keyword exist「非同期」メソッドの中に「待つ」必要があるのはなぜですか?

私は二つの方法があります。 1つは通常のメソッド(MyMethod)で、もう1つは非同期メソッド(MyMethodAsync)です。コンパイルエラーが発生します。 「待つ」演算子のみ非同期メソッド内で使用することができる

static string MyMethod() 
{ 
    var result = await MyMethodAsync(); // compile error here 
    return result; 
} 

async static Task<string> MyMethodAsync() 
{ 
    /** perform my logic here... **/ 
    Thread.Sleep(1000); 

    return "yes"; 
} 

エラーメッセージがあります。このメソッドを 'async'修飾子でマークし、戻り値の型を 'Task'に変更することを検討してください。

私は混乱しています。 awaitキーワードを使用すると、呼び出しスレッドが中断され、タスクの完了を待ちます。したがって、awaitが使用されると、このメソッドは非同期メソッドではなくなりました。右?

備考:ロジックをMyMethodに、MyMethodAsyncには、MyMethodとしてください。どのように非同期および内部の作業を待つように洞察力の膨大な量のために

答えて

2

、ジョンスキートのEduAsyncブログのシリーズをチェックアウト:msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx

このMSDNの記事も、それを説明する:http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

を基本的には:によって変更方法をasyncキーワードには少なくとも1つの式または文が待たれます。このメソッドは、最初のawait式に達するまで同期的に実行されます。この時点で、待機しているタスクが完了するまで中断されます。その間、制御はメソッドの呼び出し側に返されます。メソッドが待機する式または文を含まない場合、メソッドは同期的に実行されます。

は最後に、このMSDNの記事:http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspxは、ステップバイステップの例をウォークスルー、およそ1/3ページダウンの方法の:

4

asyncキーワードの全体のポイントはawaitキーワードを有効にすることです。

「キーワードがそのように機能するのはなぜですか?」質問on my blog。 「の存在によってasyncが推測できないのはなぜですか? answered conclusively by Eric Lippert on his blogであった。つまり、下位互換性とコードの可読性の2つの理由があります。

関連する問題