この方法があります:
async Task<int> AccessTheWebAsync()
{
HttpClient client = new HttpClient();
Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
// You can do work here that doesn't rely on the string from GetStringAsync.
DoIndependentWork();
string urlContents = await getStringTask;
//The thing is that this returns an int to a method that has a return type of Task<int>
return urlContents.Length;
}
Task<int>
との間で暗黙の変換が発生しint
ますか?そうでない場合、何が起こっているのでしょうか?それはどのように機能するように実装されていますか?
Task <>とintの間で暗黙の変換が発生しますか?
いいえ。これはasync
/のawait
仕組みの一部にすぎません。
として宣言されたメソッドasync
は、次の戻り値の型を持っている必要があります。
void
(可能であれば避けてください)Task
(完了/失敗の通知以外の結果はありません)Task<T>
(T
非同期方式の型の論理結果の場合)コンパイラはすべての適切なラッピングを行います。重要なのは、非同期で戻っているということです。実際のメソッドは、まだ完了していない最初の式にヒットしたときに返されるurlContents.Length
ため、メソッドを単に返すようにすることはできません。したがって、代わりに、asyncメソッド自体が完了すると完了するaを返します。int
await
Task<int>
await
逆のことをすることに注意してください-それはaを値にアンラップTask<T>
しT
ます、それはこの行がどのように機能するかです:
string urlContents = await getStringTask;
...しかしもちろん、非同期でアンラップしますが、使用Result
するだけでタスクが完了するまでブロックされます。(await
待機可能なパターンを実装する他のタイプをアンラップTask<T>
できますが、最も頻繁に使用する可能性が高いタイプです。)
この二重のラッピング/アンラッピングにより、非同期を非常に構成可能にすることができます。たとえば、あなたを呼び出して結果を2倍にする別の非同期メソッドを作成できます。
public async Task<int> AccessTheWebAndDoubleAsync()
{
var task = AccessTheWebAsync();
int result = await task;
return result * 2;
}
(または単にreturn await AccessTheWebAsync() * 2;
もちろんです。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加