■101716 / ) |
Re[4]: 複数のBackgroundWorkerが1つしか実行されない |
□投稿者/ Azulean (1268回)-(2023/04/09(Sun) 08:18:47)
|
■No101710 (ゆのじ さん) に返信 > ブレークポイントを入れても唯一値を返してくるインスタンス以外のBackgroundWorkerは引っかからず、「すべて中断」では停止場所がよく分からない > (メインフォームからサブフォームをForm2.Showdialog()のようにして呼び出してサブフォームの中で上記の処理を行っているのですが、「すべて中断」でも > Form2.ShowDialog()の部分が緑色になるだけで、肝心のMainFunctionのどこで止まっているのかが分からない)状態です。
すでにアドバイスがあるように別スレッドの状態も観察できる機能(並列スタックなど)がありますので、ぜひ活用してください。
> CPU使用率自体は1つのBackgroundWorkerが処理を終えて結果を返してきても依然として高いままなので、他のBackgroundWorkerも何らかの処理を > 行っていることは間違いないとは思うのですが・・・
「高いまま」というのは、複数のコアがそれぞれ 100% 近く稼働しているということですか? タスクマネージャの CPU 使用率は全コアの合算なので、これが 90% ~ 100% という風になっているなら、すべてのコアが稼働していると言えそうですが…。
> >・その MainFunction 内の処理時間がかかるところでまとめて Invoke してメインスレッドに処理をさせている。(並列化の意味がない) > >・その MainFunction 内で排他処理が入っている。(並列できないように作り上げている) > > については行っていないと思います(Invokeや排他制御について使い方を知らないため、そのような処理を行うコードを書いていない)。
直接書いていなくても、既存の資産を利用している、外部ライブラリを利用しているなどあれば、該当する可能性は出てきますね。 このほかに、STA の COM を使っている場合もメインスレッドに処理が振られることはあります。
> Azulean様の書き込みからすると、上記MainFunctionを複数のBackgroundWorkerから同時に使うこと自体は問題ではないということでしょうか? > デバッガを上手く使えてないようですので、MainFunctionのどこで止まっているか確認する方法があればご教示いただければ幸いです。
この擬似コードにおける表面的な部分で、問題は見えません。 中身が何か悪い、中身が排他する・同時実行できない性質を持つ可能性が高いです。
職場のコードであれば開示できないと思いますので、ご自身で並列スレッドにおけるデバッグ技能を磨き、スレッド間排他になり得る要素、あるいは必ずメインスレッドで処理させてしまう要素を見つけるしかありません。
■No101714 (ゆのじ さん) に返信 > アドバイスをいただいておいて申し訳ありませんが、今回はBackgroundWorkerを使用し、それがダメであれば並列化は諦めて > 1スレッドでの順次実行という形をとりたいと思います。 > ただ1スレッドだとかなり計算に時間がかかってしまうので、できれば今回実装した並列化の形は活かしたいところではあります。
気にしなくて良いと思います。 今回の質問における「問題の本質」は、Parallel.For でも Task でも起きる話である可能性は高く、本質の解決に当てる時間を優先するべきでしょうから。
|
|