0

.net ThreadPool を使用してマルチスレッド環境をセットアップでき、パフォーマンスが大幅に向上しました。これは、アプリケーションのバックグラウンドで実行されます。

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

私の問題にはいくつかの解決策があるかもしれません:

を。より少ないバックグラウンド スレッドを開始して、新しいユーザー リクエストが CPU リソースの一部を共有できるようにします。(しかし、私は持っていたパフォーマンスの向上を失います:( )

b. 新しいユーザーが要求したタスクのスレッドにより高い優先度を設定します。(これが機能するかどうかわからない?)

c. 私が始めた ThreadPool スレッドの一時停止/再開。ただし、スレッドの一時停止/再開/中断はお勧めできません。さらに、これは扱いにくく、エラーが発生しやすくなる可能性があります。

他のアイデアはありますか?

注: ユーザーがリクエストを行うと、通常、タスクの実行に 300 ミリ秒以上かかることはありません。ただし、バックグラウンドで ThreadPool スレッドを開始すると、完了するまでに約 3 秒かかります (10 倍悪い)。500~800msかかってもOKです。すべてのバックグラウンド スレッドは約 8 秒で完了します (さらに 1 ~ 2 秒かかっても問題ありません)。したがって、今のところオプション ( a ) を試しています。

前もって感謝します!

4

1 に答える 1

0

スレッドのスケジューリングはCPUによって行われるため、プログラム内から指示することはできないことに注意してください。実行できるのは、ThreadPriorityを設定することだけです(これは、ThreadPoolスレッドではなく、新しいスレッドでも同様です)。スレッドプールの使用に関する制限事項のセクションを確認してください

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

これで、バックグラウンドタスクで実行されるメソッドにチェックポイントを設定できます。チェックポイントで、クラスレベルフラグをチェックします。設定されている場合は、Thread.Sleepを呼び出します。これにより、OS / CPUスレッドスケジューラによるスレッドコンテキストスイッチがトリガーされます(必須ではありません)。

(ThreadPoolによって実行される)メソッドにチェックポイントを配置することは、バックグラウンドワーカーでキャンセルサポートのためにチェックポイントを配置することに似ています。

于 2012-05-13T11:41:50.367 に答える