あなたは画像をダウンロードしているときに、呼び出し元のスレッドをブロックすることはありません
await Task.Run(DownloadImageMethod);
これを呼び出すことができますし、終了したダウンロードするときに、次のコードの実行を継続します。
Task.Run(DownloadImageMethod);
画像がダウンロードされても、次のコードの実行を継続する場合は、呼び出しスレッドがブロックされません。これは、次のメソッド/コマンドを実行する前にダウンロードが完了するのを待つことはありません。
は、例えばSO上、ここで同様の質問を見てみましょう:
Aync/Await action within Task.Run()
TLDR。
Task.Run
は新しいスレッドを作成して開始します。このスレッドは非同期に実行されます。
スレッドを同期して実行する場合は、Task.Wait()
メソッドを呼び出すだけで済みません。
スレッドを非同期に実行するが、同期のように振りたい場合は、先にawait
(await Task.Run(...)
)を入れることができます。これにより、コードを逐次的に書くことができ、コールバックに対処する必要はありません。
Task.Run
で新しいスレッドを開始すると、そのスレッドは現在のスレッドを解放し、その中で他の作業を行うことができます。私は、これがコンソールアプリケーションのあなたのケースでどのように役立つか分かりません。
良い例が、UIスレッドでレンダリングが行われるデスクトップアプリケーションやモバイルアプリケーションのUIスレッドです。イメージをダウンロードしている間にUIスレッドがその処理をやめないようにすることは望ましくありません。
この場合、await Task.Run(...)
は別のスレッドを開始し、UIスレッドで他の作業を続行し、タスクが完了したらUIスレッドに戻ります。UIスレッドでコントロールを操作し、UI関連のプロパティを更新できます。
- EDIT
使用Task.Run
のみ必要 - あなたはTask.Run
以内に呼び出す方法がより0.5秒間実行されてしまうだけ。これにより、IO操作を実行するときにアプリケーションが「フリーズ」するのを防ぎます。
Webアプリケーション(ASP.NET)では、async/awaitはそれぞれのリクエストが独自のスレッドを取得し、デスクトップやモバイルアプリケーションのようにスレッドをブロックしないため、あまり役に立ちません。あなたはアプリケーションを構築している技術(UWP/WPF/ASP/WF ...)を教えてください。 –
.net 4.5でデスクトップコンソールアプリケーションを作成しようとしています – knowdotnet
IO操作にasync/awaitを使用します。 Task.Runはスレッドプールを枯渇させます。 –