• ベストアンサー

C# スレッド終了の監視について

お世話になります。 C#2005でプログラムを作成しております。 マルチスレッドでの、スレッドの終了の監視のことでご質問させていただきます。 下記のコードを実行すると、問題なく実行されます。 ------------------------------------------------------------------------------------ private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入 */ } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ このスレッドの終了を監視したく、下記のコードを追加してデバッグしてみましたが、 スレッドが実行されませんでした。 ------------------------------------------------------------------------------------ int isRcvSearchFlg = 0; private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); // スレッドが終了するまで待機する for (; ; ) { if (isRcvSearchFlg == 1) { break; } } } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入 */ isRcvSearchFlg = 1; } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ また、以下も試してみましたが、結果は同じでした。 ------------------------------------------------------------------------------------ private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); // スレッドが終了するまで待機する RcvSetThread.Join(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入処理 */ } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ スレッドの終了を監視する方法がわからず困っております。 お手数ですが、ご教授いただきたくよろしくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

> Invoke(new RcvDataSetDelegate(RcvDataGridSet)); これは、別スレッドからフォームを生成したスレッドでの呼び出しと見てよいでしょうか。。。 また、フォーム生成はメインスレッドで行っているものとして説明します。 メインスレッドを停止した状態で、メインスレッドを呼び出すInvokeは使えません。SetDataTreeViewを脱出しなければ、メインスレッドが次の処理(つまりInvokeによる呼び出し)を行えないからです。 Invokeが戻り値を待つ + Invoke先のスレッドが停止している というデッドロックが発生しているのだと思います。 メインスレッドに対するInvokeはウィンドウメッセージを使って呼び出されているので、Application.DoEventsでメッセージキューを優先処理させれば動作すると思います。2番目のコードのforループを次のように書き換えて試してみてください。 while (isRcvSearchFlg != 1) Application.DoEvents();

noname#164045
質問者

お礼

ありがとうございます。 デットロックせずに実行することを確認できました。

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

BackgroundWorkerを使う方向のほうがいいかもしれませんよ