をいくつかの光を入れてくださいでした。あなたはstring
を返そうとしています。それらは同じではなく、文字列からTask<string>
への暗黙的な変換もないため、エラーです。
戻り値がTask
にコンパイラによって自動的にラップされるasync
メソッドと混乱する可能性があります。現在、このメソッドは非同期メソッドではありません。あなたはほとんどこれを行うことを意味しました:
private async Task<string> methodAsync()
{
await Task.Delay(10000);
return "Hello";
}
2つの重要な変更があります。まず、メソッドはasync
とマークされます。戻り値の型はTask
にラップされ、メソッドがコンパイルされます。次に、ブロック待ちをしたくありません。一般的なルールとして、await
モデルを使用する場合は、できる限り待機をブロックしないようにしてください。 Task.Delay
は、指定されたミリ秒後に完了するタスクです。 await
- この作業では、その時間のノンブロッキング待機を効果的に実行しています(実際には、残りのメソッドはそのタスクの続きです)。
あなたがそれを行うの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";
});
}
以上の可能性:
@Servyで指摘したように
async
の問題の使用を越えて
private Task<string> methodAsync()
{
return Task.Run(()=>
{
return SomeLongRunningMethodThatReturnsAString();
});
}
どのように私は明示的に '' Task'でSTRING'をラップすることができますか?ORは、呼び出されているメソッド(この場合はmethodAsync)で 'async'と' await'を使わずに 'Task'または' Task 'を返す方法はありませんか? –
dotNETbeginner
@dotNETbeginnerいいえ –
@Aniketいいえ、間違っています。タスクに文字列を明示的にラップする方法はたくさんあります。私は解を編集します。 – Servy