2016-06-13 17 views
0

私は多くのポストを読んだが、これらを区別することはできません。私が理解できるのは、Task.Runがバックグラウンドスレッドを呼び出すことだけでした。 async-awaitは非同期プログラミングです。Task.Runを使用するタイミングasync-awaitを使用するタイミングと組み合わせて使用​​するタイミング

Task.Runはバックグラウンドスレッドがブロックスレッドとして動作することを意味しますか?

インターネットから複数の大きな画像をダウンロードしようとしています。これらのキーワードを組み合わせて使用​​する理由とその理由は何ですか?

+0

Webアプリケーション(ASP.NET)では、async/awaitはそれぞれのリクエストが独自のスレッドを取得し、デスクトップやモバイルアプリケーションのようにスレッドをブロックしないため、あまり役に立ちません。あなたはアプリケーションを構築している技術(UWP/WPF/ASP/WF ...)を教えてください。 –

+0

.net 4.5でデスクトップコンソールアプリケーションを作成しようとしています – knowdotnet

+0

IO操作にasync/awaitを使用します。 Task.Runはスレッドプールを枯渇させます。 –

答えて

0

あなたは画像をダウンロードしているときに、呼び出し元のスレッドをブロックすることはありません

await Task.Run(DownloadImageMethod); 

これを呼び出すことができますし、終了したダウンロードするときに、次のコードの実行を継続します。

Task.Run(DownloadImageMethod); 

画像がダウンロードされても、次のコードの実行を継続する場合は、呼び出しスレッドがブロックされません。これは、次のメソッド/コマンドを実行する前にダウンロードが完了するのを待つことはありません。


は、例えばSO上、ここで同様の質問を見てみましょう:

Aync/Await action within Task.Run()

TLDR。

Task.Runは新しいスレッドを作成して開始します。このスレッドは非同期に実行されます。

スレッドを同期して実行する場合は、Task.Wait()メソッドを呼び出すだけで済みません。

スレッドを非同期に実行するが、同期のように振りたい場合は、先にawaitawait Task.Run(...))を入れることができます。これにより、コードを逐次的に書くことができ、コールバックに対処する必要はありません。

Task.Runで新しいスレッドを開始すると、そのスレッドは現在のスレッドを解放し、その中で他の作業を行うことができます。私は、これがコンソールアプリケーションのあなたのケースでどのように役立つか分かりません。

良い例が、UIスレッドでレンダリングが行われるデスクトップアプリケーションやモバイルアプリケーションのUIスレッドです。イメージをダウンロードしている間にUIスレッドがその処理をやめないようにすることは望ましくありません。

この場合、await Task.Run(...)は別のスレッドを開始し、UIスレッドで他の作業を続行し、タスクが完了したらUIスレッドに戻ります。UIスレッドでコントロールを操作し、UI関連のプロパティを更新できます。

- EDIT

使用Task.Runのみ必要 - あなたはTask.Run以内に呼び出す方法がより0.5秒間実行されてしまうだけ。これにより、IO操作を実行するときにアプリケーションが「フリーズ」するのを防ぎます。

1

タスクを使用するタイミング。実行、使用することがasync-待つと組み合わせ

にそれらを使用するときに私はentire blog series on the subjectを持っていますが、要約するとき:

  • 使用Task.Run CPUバウンド(またはブロック)を移動するためのオフに働きますUIを持つアプリケーション用のUIスレッド。
  • 入出力バインド作業にはasync/awaitを使用してください。

Task.Runまたはasyncが役に立つ場合もありますが、上記の2つのポイントはほとんどの場合のガイダンスです。

Task.Runはバックグラウンドスレッドがブロックスレッドとして動作することを意味しますか?

Task.Runは、実際には同期または非同期で実行できますが、スレッドプールスレッドを使用します。

私は、インターネットから複数の大きな画像をダウンロードしようとすると、.NET 4.5

にデスクトップコンソールアプリケーションを作成しようとしています。これらのキーワードを組み合わせて使用​​する理由とその理由は何ですか?

あなたは間違いなくasync/awaitを好む必要がありますので、これは、非UIアプリでI/Oバウンド操作です。

関連する問題