2016-06-29 8 views
0

私はそのGUIにWPFを使用するアプリケーションを持っていますが、コマンドでは非常に重い処理負荷が発生します。 エンジン(重い処理)が実行されていて、VS2015の「アプリケーションタイムライン」ツールを使用しているときに、私のエンジンコードの一部がUIスレッド上で実行されていることに気付きました。WPF DispatcherとWork Stealing?

エンジンは、LongRunningフラグが分かっていれば、新しいスレッドを作成し、そのスレッドで所定の関数を実行する次の行で開始されます。

 rootTask = Task.Factory.StartNew(DoWork, TaskCreationOptions.LongRunning); 

上で参照DoWork方法は、繰り返しタスクの数百人をキューするParallel.Forを使用しています。

TaskSchedulerキューからタスクを実行することによってディスパッチャスレッドが「助けている」可能性はありますか?もしそうなら、これがGUIの応答性を維持するのを防ぐことは可能ですか(バックグラウンドタスクを損なうものではないでしょうか)?

+0

アクティブなスレッドの数が多すぎて、すべてのコアをCPUから取得している可能性があります。いくつかのワーカースレッドを作成し、数百のスレッドを作成する代わりにワークアイテムをキューに入れる方がよいでしょう。 – Wouter

+0

私は確かにすべてのプロセッサコアを使用することを期待していますが、 'Parrallel.For'は管理されたスレッドプールのタスクをキューに入れ、UIスレッドに表示してディスパッチャーよりも低い優先順位にするべきです。 –

+0

ワーカースレッドでManagedThreadIdのようなSystem.Threading.Thread.CurrentThread.propertiesをチェックしてください。すべてがスレッドプールを通過する場合は、スレッドがUIスレッドにディスパッチされない限り、メインスレッドにはすべきではありません。また、(Concurrency Visualizer)のようなプロファイラを使用して、スレッドを視覚化します。しかし、スレッド数が多いと、CPUとスレッドの切り替えが開始されます。これはプロセスエクスプローラのようなツールで簡単に見ることができます。 – Wouter

答えて

0

ディスパッチャスレッドがTaskSchedulerキューからタスクを実行することによって「助けている」可能性はありますか?

私の知る限り、これは不可能です。 Taskから来るコードの一部がディスパッチャスレッド上で実際に実行されると、それはタスクが明示的にスケジューリングする必要があることを意味します。

関連する問題