私はWebClient
がDownloadStringAsyncを待ってからDownloadStringをラップするタスクを待つ間の違いは何ですか?
var result = await client.DownloadStringAsync(url);
のように使用し、それは単純にまず
var result = await new Task<string>(() => client.DownloadString(url));
私はWebClient
がDownloadStringAsyncを待ってからDownloadStringをラップするタスクを待つ間の違いは何ですか?
var result = await client.DownloadStringAsync(url);
のように使用し、それは単純にまず
var result = await new Task<string>(() => client.DownloadString(url));
をやっていることを何が違うのだOW私は思ったんだけど、あなたはわずかな構文エラーを持つことができDownloadStringAsync
方法を持っていることを理解しますあなたの2番目のサンプル。あなたは代わりにTask.Run
を使用する必要があります。
var result = await Task<string>.Run(() => client.DownloadString(url));
最初の例では、現在のスレッドにDownloadStringAsync
で開始し、他の仕事をするために、そのスレッドを解放します。
2番目の例では、新しいスレッドを作成し、そのスレッドで同期してDownloadString
を実行します。
どちらが良いかどうかは、Task
がCPUにバインドされているかどうかによって異なります。この場合、スレッドを消費しないので、DownloadStringAsync
が優れています。
DownloadStringAsync
がネットワークリクエストの発火し、リクエストが完了したネットワークからの割り込みを受け取ったときに、結果を受け取ったままで残りました。それは、その時間に、スレッドが積極的にそれを待っていたことを意味しません。 Task
は、CPUバウンドが、それは本当に違いを作るサンパウロ-モルガドは説明@のよう
EDIT
(存在する可能性がある任意の小さなオーバーヘッドをバー)しないで、他の例では、
彼の答えで、あなたがDownloadStringAsync
と言うとき、私はDownloadStringTaskAsync
を意味すると思います。前者はTask
を返さないため、async/awaitでは使用できません。後者は待つことができるものです。
WebClient
クラスは、タスクの存在に先立って、Task-based Asynchronous Pattern (TAP)です。
したがって、既存の非同期接尾辞のメソッドは、返信がイベントの形式で提供されるEvent-based Asynchronous Pattern (EAP)を使用します。
DownloadStringAsync methodへの再生は、DownloadCompletedEventで受信されます。
この場合、TAPメソッドの末尾にTaskAsyncを付ける必要があります。
これはWebClient
クラスで発生します。
のフレンドリーな使用を希望する場合は、DownloadStringTaskAsync methodを使用してください。
'DownloadStringAsync'と' DownloadStringTaskAsync'の違いに気づいた点も私の答えに反映されています – Kenneth
あなたの仕事が決して始まっていないので、2番目のスニペットは動作しません – taquion
@taquion私は新しい仕事を作ることによってそれが "ホット"になると思った – user7127000
いいえ、あなたがTask.Run(あなたのラムダ)これは待っている。 – taquion