2017-05-31 1 views
0

以下のように定義されたメソッドは何も返しません。それで、それはどのようにしてこのようなメソッドが "タスク"を返さなければならないという通常の構文に が収まるのですか? このため、「async」を削除すると、以下のメソッドはコンパイルされません。"async"と戻り値のタイプが "Task"でないメソッドの奇妙な定義ですか?

static async Task MyAsyncMethod() { } 

はまた、あなたが持つメソッドを呼び出すとき:

await MyAsyncMethod(); 

awaitableオブジェクトで呼び出されることになったが、ここに戻っ タイプが

awaitableない「構造体のボイド」です「待ちます」
+0

非同期が削除された場合、あなたが実際にタスクを返す場合は、コンパイルされます。ほとんどの状況でそうすることをお勧めします。とにかく、あなたの実際の質問は何ですか?あなたのタイトルには疑問符がありますが、実際の質問はありません。ただの観察。 – mason

+0

'Task'は、非同期操作が完了したときにランタイムがどのように判断できるのかという理由から返されます。コンパイル中に 'void 'とマークするだけで、「fire and forget」として扱われ、他のロジックを実行する前にそのタスクが完了するのを待つ方法がありません。ファイアアンドファントセマンティクスは、イベントハンドラ(ボタンクリックなど)に予約されています。 –

+0

ポイントは構文の整合性です。構文が「タスク」を返すと言われても、実際には他の修飾子に依存しているので、説明する必要があります。 –

答えて

2

することはでき

public async Task DoAsync() 
{ 
    // do anything synchron here 
    // await other Task 
} 

または

public Task DoAsync() 
{ 
    // do anything synchron here 
    return Task.CompletedTask; 
} 

または

public Task DoAsync() 
{ 
    // do anything synchron here 
    return Task.FromResult(false); 
} 
関連する問題