この方法があります:
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
? 発生しない場合は、何が起こりますか? どのように実装されて動作しますか?
ベストアンサー1
Task<> と int の間で暗黙的な変換が発生しますか?
async
いいえ。これは仕組みの一部にすぎませんawait
。
として宣言されたメソッドは、async
戻り値の型を次のようにする必要があります。
void
(できれば避けてください)Task
(完了/不合格の通知以外の結果はありません)Task<T>
T
(非同期方式で型の論理結果を得るため)
コンパイラは適切なラッピングをすべて行います。重要なのは、非同期的に返す-実際のメソッドは、まだ完了していない最初の式に達したときに返されるため、urlContents.Length
メソッドを単に を返すようにすることはできません。そのため、代わりに、非同期メソッド自体が完了したときに完了する を返します。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;
にそうでもいいです。)