2012-05-13 14 views
0

私は、.net ThreadPoolを使用してマルチスレッド環境をセットアップすることができました。これは私のアプリケーションのバックグラウンドで実行されます。.net 4.0 c#:一時停止/スレッドプールから並列実行スレッドを一時的に再開しますか?

新しいタスクがユーザーから要求されたとき、パフォーマンスを最大限にするために最大CPUリソースを取得します。したがって私は、(ThreadPool.Queueuserworkitemメソッドで)開始したすべてのスレッドを一時的に一時停止し、ユーザーがフォアグラウンドで要求した新しいタスクが完了すると、再開します。

私の問題には、いくつかの解決策が考えられます:

。新規のユーザー要求がCPUリソースの一部を取得するように、より低いバックグラウンドスレッドを開始する。

bは(私は、私は:(持っていたパフォーマンスの向上を失う)。新規ユーザのためのスレッドのために高い優先度を設定し、タスクを要求した。(これが動作するかどうかわからない?)

C。のThreadPoolを再開/一時停止。。。私は始めたが、サスペンド/スレッドを中断/再開することは非常に落胆している。また、これが発生しやすいトリッキーとエラーが出る可能性があり

どれでも他のアイデアをスレッド

注:?ユーザーが要求を行う、タスクを考え実行します通常は300ms以上かかることはありませんが、バックグラウンドでThreadPoolスレッドを開始すると、現在は約3seco完了するまでに10回悪化する!私はそれが500-800ミリ秒かかる場合でもOKです。すべてのバックグラウンドスレッドは約8秒で完了します(さらに1〜2秒かかる場合は正常です)。したがって、私は今のところオプション(a)を試しています。

ありがとうございます!

+0

を置くことに類似しています。 –

答えて

0

スレッドスケジューリングはCPUによって行われるため、プログラム内からの指示はできません。実行できるのは、ThreadPriorityを設定することだけです(新しいThreadsではThreadPoolスレッドではなく)。チェック・セクションLimitations of Using the Thread Pool

新しいタスクの実行中にすべてのバックグラウンド・スレッドを停止する必要があるため、クラス・レベル・フラグを作成することができます。

これで、バックグラウンドタスクで実行されるメソッドにチェックポイントを置くことができます。チェックポイントで、クラスレベルフラグが設定されている場合は、OS/CPUスレッドスケジューラによってスレッドコンテキストスイッチを起動する必要があるThread.Sleepを呼び出します(必ずしもそうでなければなりません)。 (スレッドプールで実行される)の方法でチェックポイントを置く

ちょうど代わりに、スレッドプールのスレッドを使用checkpoints for cancellation support in background worker.