DOBON.NET DOBON.NETプログラミング掲示板過去ログ

マルチスレッドとパフォーマンスの悪化について

環境/言語:[WindowsXP,VB.NET2003]
分類:[.NET]

お世話になります。

早速本題に入らせていただきますが、VB.NETでマルチスレッドの
アプリケーションを作成しました。
方法としてはThreadを使用しているのですが、スレッドを430回程呼び出した辺りで
エラー(「ウィンドウのハンドルを作成中にエラーが発生しました。」と
いう内容です)をCatchしてそれ以上スレッドが実行できなくなり、
アプリケーション自体が固まってしまいます。
この現象を回避するために現在はアプリケーションを定期的に再起動しています。
しかし処理数が今後増加していくことが明らかであるので、このままでは
増加に伴い再起動する間隔をどんどん短縮していく必要があり、
あまり良い対策ではないと思っています。
そこで、Threadのパフォーマンス問題を解決するとされているThreadPoolに
変更しました。予想ではThreadPoolでもゆくゆくは同様に固まるかもしれないが
Threadよりは遥かに多くのスレッドを実行できるだろうと思っていたのですが、
結果は予想を裏切るものでした。Threadでは430件程スレッドを実行した
ところでエラーになりましたが、ThreadPoolでは20件少ない410件程で
エラーとなりました(エラーの内容は同じです)。私の開発機(WindowsXP)と
アプリケーションを稼動させるサーバー(WindowsServer2003)で試してみたのですが、
同様の結果となりました(件数は若干差があります)。

色々と検索してみたのですが同じような事例を見つけられず、
手詰まりとなっております。
マルチスレッドの実行に伴うパフォーマンスの悪化を少しでも
回避できるような方法をご存知であればお教えいただければと思います。
大変申し訳ありませんが宜しくお願い致します。長文失礼致しました。
使い終わった後に資源の解放とかちゃんとやってますか?
Threadを430個あげてたりしませんか?
> 色々と検索してみたのですが同じような事例を見つけられず、
> 手詰まりとなっております。

そりゃそうでしょう。
グリッドでもないのに、430個ものスレッドを起動するような設計は普通しませんから。

> マルチスレッドの実行に伴うパフォーマンスの悪化を少しでも
> 回避できるような方法をご存知であればお教えいただければと思います。

回避できません。
そういうもんなんです。

ますは、処理1件に対して1個のスレッドを割り当てるような設計を見直すべきです。

Webサーバなんか、同時に何千接続もさばくわけですが、だからといって何千個ものスレッドが起動しているわけではありません。
返答をいただきましてありがとうございました。

中さんご指摘の通り資源の解放ができていませんでした。恥ずかしい話ですが、
必要ないと思っていた箇所と解放できていないのにしたつもりになっていた
箇所がありました。
この点を修正して試したところ、パフォーマンスが向上しました。
Threadは570回程スレッドを起動したところで上記同様のエラーとなりました。
ThreadPoolの方は800回程スレッドを起動しましたがエラーは発生せず、
タスクマネージャで見てもメモリ使用量はほぼ一定のままで、Threadより
ThreadPoolの方が効率よく処理できるという結果が出ました。
そのため現行のThreadからThreadPoolに移行することにしようと思います。

>ますは、処理1件に対して1個のスレッドを割り当てるような設計を見直すべきです。

複数件の処理を平行して行いたくて、そのような設計をしてしまいました。
今後見直しをしていきたいと思います。

以上です。私の勉強不足・認識不足で申し訳ありませんでした。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板