0

IOを多用するアプリのThreadPoolの最大スレッド数の設定が低すぎる(16)と、GUIがフリーズすることに気づきました。しかし、かなり高く(250)設定すると、問題なく動作します。

誰かがこの現象を説明できますか?

4

1 に答える 1

3

うわあ!自分が何をしているのかわからない限り、ThreadPool カウントを台無しにしないでください。多くの重要な .NET サービスがそれを使用し、飽和していないことに依存している可能性があります。ほぼ確実に、基本的な IO コードの一部が飽和によってデッドロックになっています。

この特定のケースであなたをつまずかせているのはIO完了ポートだと思います...

Joe Duffy (私よりもスレッドについて詳しい) は、これについていくつかの考えを持っています

飽和によってそれをデッドロックする方法を再確認してください。これは、思考実験で簡単に再現できます。2 つのことを行う必要があるワーカー コードが少しあるとします。そのうちの 1 つを ThreadPool にプッシュし、1 つを自分で実行します。独自の作業を行った後、2 番目のタスクを Join() [または同等の ThreadPool] して、両方が終了したことを確認します。

ここで、このワーカー コードを最後の利用可能な ThreadPool スレッドで開始すると想像してください。独自の作業を行い、2 番目のタスクが終了したというシグナルを待ちますが、それを実行できるスレッドはありません! そして、私たちはまだ待っているので、自分自身を解放することはできません.

IO 完了ポートでも同じことができます。

于 2008-11-05T21:57:16.320 に答える