8

Delegate.BeginInvokeが呼び出されると、デリゲートメソッドの実行に1秒以上かかる場合があります。

遅延の理由は何でしょうか?この問題は、継続的に実行されるアプリケーションで1日に1〜2回発生します。

私を助けてください。

ありがとう!

4

3 に答える 3

9

スレッド プール マネージャーは、CPU コアと同じ数のスレッドのみが実行できるようにします。1 つが完了するとすぐに、キューで待機している別のものが実行可能になります。

1 秒に 2 回、実行中のスレッドで何が起こっているかを再評価します。完了しない場合は、ブロックされていると見なされ、待機中の別のスレッドの実行が許可されます。典型的な 2 コア CPU では、すぐに 2 つのスレッドが実行され、3 番目のスレッドは 1 秒後に開始され、4 番目のスレッドは 1.5 秒後に開始されます。

さて、あなたの2番目があります。Q&D での修正は、ThreadPool.SetMinThreads() を使用することですが、それは大ハンマー ソリューションです。本当の問題は、プログラムが実行時間の長いタスクにスレッド プール スレッドを使用していることです。大量のコードを実行するか、ある種の I/O 要求でブロックするためです。後者はより一般的なケースです。

それを解決する方法は、そのようなブロッキング スレッドにスレッド プール スレッドを使用せず、代わりに Thread クラスを使用することです。スレッドが実際に CPU サイクルを消費している場合は、これを行わないでください。すべてが遅くなります。簡単に言うと、Taskmgr.exe で 100% の CPU 負荷が表示されます。

于 2010-08-06T15:29:54.067 に答える
5

を使用してDelegate.BeginInvokeいるので、間接的にThreadPool. は、ThreadPool完了したスレッドをリサイクルし、新しいスレッドを作成して完了したスレッドを破棄するという費用をかけずに再利用できるようにします。

そのため...使用するDelegate.BeginInvoke場合、呼び出されるメソッドをキューに追加しているThreadPoolと、タスクに使用可能なスレッドがあるとすぐに実行されます。ただし、ThreadPool使用可能なスレッドが不足している場合は、待機状態になります。

System.Threading.ThreadPoolThreadPoolには、使用可能なスレッドの数、最大値などを示すいくつかのプロパティとメソッドがあります。これらの数を監視して、スレッドが薄く広がっているように見えるかどうかを確認します。

その場合、最善の解決策は、 が存続ThreadPool期間の短い (小さな) タスクにのみ使用されるようにすることです。長時間実行されるタスクに使用されている場合は、ThreadPool を占有するのではなく、独自の専用スレッドを使用するようにそれらのタスクを変更する必要があります。

于 2010-08-06T13:51:23.190 に答える
2

BeginInvoke の優先度を設定できますか?

http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcherpriority.aspx

他の BeginInvoke 呼び出しを待っていますか?

「複数の BeginInvoke 呼び出しが同じ DispatcherPriority で行われた場合、それらは呼び出しが行われた順序で実行されます。」

http://msdn.microsoft.com/en-us/library/ms591206.aspx

于 2010-08-06T13:38:05.283 に答える