タスクはどのように intになるには?質問する

タスクはどのように intになるには?質問する

この方法があります:

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メソッドを単に を返すようにすることはできません。そのため、代わりに、非同期メソッド自体が完了したときに完了する を返します。intawaitTask<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;にそうでもいいです。)

おすすめ記事