リストされているメソッドの戻り値の型は ですTask<string>
。を返そうとしていますstring
。それらは同じではなく、 string から への暗黙的な変換もないTask<string>
ため、エラーが発生します。
これを、コンパイラによってasync
戻り値が自動的に a にラップされるメソッドと混同している可能性があります。Task
現在、そのメソッドは非同期メソッドではありません。あなたはほぼ間違いなくこれを行うつもりでした:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
主な変更点は 2 つあります。まず、メソッドは としてマークされますasync
。これは、戻り値の型が でラップされTask
、メソッドがコンパイルされることを意味します。次に、ブロッキング待機を行いたくありません。原則として、await
モデルを使用するときは、できる限り待機をブロックしないようにしてください。 Task.Delay
指定されたミリ秒数後に完了するタスクです。そのタスクをawait
-ing することで、その時間の非ブロッキング待機を効果的に実行しています (実際には、メソッドの残りの部分はそのタスクの継続です)。
を使用せずに 4.0 の方法を使用await
したい場合は、次のようにします。
private Task<string> methodAsync()
{
return Task.Delay(10000)
.ContinueWith(t => "Hello");
}
最初のバージョンは多かれ少なかれこれに似たものにコンパイルされますが、await
ここでは利用していないエラー処理やその他の機能をサポートするために、いくつかの追加のボイラープレート コードが含まれています。
Thread.Sleep(10000)
しばらく待つ方法ではなく、長時間実行されるメソッドの単なるプレースホルダーであることが本当に意図されている場合は、現在のコンテキストではなく、別のスレッドで作業が行われるようにする必要があります。これを行う最も簡単な方法は次のTask.Run
とおりです。
private Task<string> methodAsync()
{
return Task.Run(()=>
{
SomeLongRunningMethod();
return "Hello";
});
}
または、より可能性が高い:
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}