10

重複の可能性:
async キーワードが存在する理由

私には2つの方法があります。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";
}

エラーメッセージは

「await」演算子は、非同期メソッド内でのみ使用できます。このメソッドを 'async' 修飾子でマークし、その戻り値の型を 'Task' に変更することを検討してください。

よくわかりません。awaitキーワードを使用すると、呼び出し元のスレッドが中断され、タスクの完了を待ちます。したがって、一度await使用すると、メソッドは非同期メソッドではなくなります。右?

備考:目的を達成するためにロジックMyMethodMyMethodAsync呼び出しを入れる必要があることはわかっています。MyMethod

4

2 に答える 2

4

キーワードの要点は、asyncキーワードを有効にすることawaitです。

「なぜキーワードがそのように機能するのか」をいくつか集めました。私のブログの質問。「なぜasyncの存在によって推測できないのawaitか?」という問題。Eric Lippert のブログで最終的に回答されました。つまり、下位互換性とコードの可読性という 2 つの理由があります。

于 2012-12-03T01:45:18.833 に答える
2

async と await が内部でどのように機能するかについての膨大な洞察については、Jon Skeet の 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 式またはステートメントが含まれています。メソッドは、最初の await 式に到達するまで同期的に実行されます。この時点で、待機中のタスクが完了するまで中断されます。その間、制御はメソッドの呼び出し元に返されます。メソッドに await 式またはステートメントが含まれていない場合、メソッドは同期的に実行されます。

最後に、この MSDN の記事: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspxでは、ページの約 1/3 で段階的な例を説明しています。

于 2012-12-03T00:55:15.443 に答える