私はそのGUIにWPFを使用するアプリケーションを持っていますが、コマンドでは非常に重い処理負荷が発生します。 エンジン(重い処理)が実行されていて、VS2015の「アプリケーションタイムライン」ツールを使用しているときに、私のエンジンコードの一部がUIスレッド上で実行されていることに気付きました。WPF DispatcherとWork Stealing?
エンジンは、LongRunning
フラグが分かっていれば、新しいスレッドを作成し、そのスレッドで所定の関数を実行する次の行で開始されます。
rootTask = Task.Factory.StartNew(DoWork, TaskCreationOptions.LongRunning);
上で参照DoWork
方法は、繰り返しタスクの数百人をキューするParallel.For
を使用しています。
TaskSchedulerキューからタスクを実行することによってディスパッチャスレッドが「助けている」可能性はありますか?もしそうなら、これがGUIの応答性を維持するのを防ぐことは可能ですか(バックグラウンドタスクを損なうものではないでしょうか)?
アクティブなスレッドの数が多すぎて、すべてのコアをCPUから取得している可能性があります。いくつかのワーカースレッドを作成し、数百のスレッドを作成する代わりにワークアイテムをキューに入れる方がよいでしょう。 – Wouter
私は確かにすべてのプロセッサコアを使用することを期待していますが、 'Parrallel.For'は管理されたスレッドプールのタスクをキューに入れ、UIスレッドに表示してディスパッチャーよりも低い優先順位にするべきです。 –
ワーカースレッドでManagedThreadIdのようなSystem.Threading.Thread.CurrentThread.propertiesをチェックしてください。すべてがスレッドプールを通過する場合は、スレッドがUIスレッドにディスパッチされない限り、メインスレッドにはすべきではありません。また、(Concurrency Visualizer)のようなプロファイラを使用して、スレッドを視覚化します。しかし、スレッド数が多いと、CPUとスレッドの切り替えが開始されます。これはプロセスエクスプローラのようなツールで簡単に見ることができます。 – Wouter