6

TPLとasync/awaitを使用していくつかのテストを行っていたところ、予期しないことがわかりました。たとえば、ラムダとTask.Runを使用して実行するように作業をスケジュールしていました。

Task.Run(()=>Console.WriteLine("Nice program"));

そして、プログラムがすぐに戻った場合、作業は実行されないことに気づきました。これは、.NETアプリケーション(WPF、フォームなど)で期待される動作ですか?これについて説明しているドキュメントはありますか?

これは、Task.Runが実際には火事と忘れのシナリオに向いていないことを意味します。

4

2 に答える 2

12

これは、Task.Runが実際には火事と忘れのシナリオに向いていないことを意味します。

さて、あなたは忘れたくありません-あなたはそれが完了するまで待ちたいです。だからTaskあなたに返されたものを使用してください。

これを行うには、この方法で起動したすべての未完了のタスクを追跡し、Task.WaitAll(tasks)バックグラウンド以外のスレッドのようなものを使用する必要があります。タスク自体を覚えておく必要はない可能性があります。各タスクが完了するとデクリメントされるカウンターが必要であり、それがゼロになるのを待つ必要があります。

正直に言うと、シナリオについて詳しく知らずに、それ以上に具体的なアドバイスをするのは難しいですが、そのようなことは確かにうまくいくでしょう。

もちろん、これを独自の便利なメソッドに簡単にカプセル化できます。

于 2013-01-15T20:23:36.267 に答える
3

定義上、プログラムが終了した後は、コードを実行できません。これはとは何の関係もありませんTask.Run()

あなたが実際に求めているのが次のようなものである場合:

Task■バックグラウンドスレッドで実行されるため、メインスレッドが完了した場合(たとえば、ユーザーがメインウィンドウを閉じた後)、それらが完了するか、開始することさえ保証されません。どうすれば修正できますか?

次に、2つのオプションがあります。メインスレッドを完了させない(たとえば、Task.WaitAll()Jon Skeetが提案するように呼び出す)かTask、フォアグラウンドスレッドで重要なスレッドを実行します。QueuedTaskSchedulerこれを行うには、 ParallelExtensionsExtrasから使用できます。

于 2013-01-15T21:24:42.260 に答える