2017-01-08 10 views
0

私はWebClientDownloadStringAsyncを待ってからDownloadStringをラップするタスクを待つ間の違いは何ですか?

var result = await client.DownloadStringAsync(url); 

のように使用し、それは単純にまず

var result = await new Task<string>(() => client.DownloadString(url)); 
+0

あなたの仕事が決して始まっていないので、2番目のスニペットは動作しません – taquion

+0

@taquion私は新しい仕事を作ることによってそれが "ホット"になると思った – user7127000

+0

いいえ、あなたがTask.Run(あなたのラムダ)これは待っている。 – taquion

答えて

5

をやっていることを何が違うのだ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では使用できません。後者は待つことができるものです。

1

WebClientクラスは、タスクの存在に先立って、Task-based Asynchronous Pattern (TAP)です。

したがって、既存の非同期接尾辞のメソッドは、返信がイベントの形式で提供されるEvent-based Asynchronous Pattern (EAP)を使用します。

DownloadStringAsync methodへの再生は、DownloadCompletedEventで受信されます。

この場合、TAPメソッドの末尾にTaskAsyncを付ける必要があります。

これはWebClientクラスで発生します。

のフレンドリーな使用を希望する場合は、DownloadStringTaskAsync methodを使用してください。

+0

'DownloadStringAsync'と' DownloadStringTaskAsync'の違いに気づいた点も私の答えに反映されています – Kenneth

関連する問題