- 題名: Threadオブジェクトでスレッドを作成し、Joinするとフリーズする現象について。
- 日時: 2010/01/03 22:03:43
- ID: 26170
- この記事の返信元:
- (なし)
- この記事への返信:
- [26171] Re[1]: Threadオブジェクトでスレッドを作成し、Joinするとフリーズする現象について。2010/01/03 22:31:47
- ツリーを表示
お疲れ様です。 デッドロックしています。 > // ファイルが見つかった(Form1クラスのOnRegisterFileをdelegateで呼び出す。) > mMainFrm.Invoke( mRegisterFile, filePath ); > mMainFrm.Invokeを使っているので、 OnRegisterFileメソッドは、 mMainFrmを作成したスレッド(btnFile_Clickを実行しているスレッド)上で実行されます。 mMainFrmを作成したスレッドは、btnFile_Clickメソッドが終了した後、 OnRegisterFileメソッドを呼び出します。 しかし、 > // ボタンクリック > private void btnFile_Click ( object sender , EventArgs e ) > { > Thread th = new Thread( new ThreadStart( FileFindFunc ) ); > th.Start(); > > th.Join(); // 終わるまで待つ。 > } th.Join()しているので、 btnFile_Clickメソッドは、FileFind.Find()メソッドが終わるまで待ちます。 一方、FileFind.Find()メソッドは、mMainFrm.Invokeを使っているので、 OnRegisterFileメソッドの実行が終わるまで待機します。 前述のように、OnRegisterFileメソッドは、btnFile_Clickメソッドが終わるまで実行されません。 すなわち、お互いが永久に相手の終了を待ち続けている状態です。
ありがとうございました。 とても分かりやすい説明ありがとうございました。 ■No26171に返信(H.K.R.さんの記事) > お疲れ様です。 > デッドロックしています。 > >> // ファイルが見つかった(Form1クラスのOnRegisterFileをdelegateで呼び出す。) >> mMainFrm.Invoke( mRegisterFile, filePath ); >> > > mMainFrm.Invokeを使っているので、 > OnRegisterFileメソッドは、 > mMainFrmを作成したスレッド(btnFile_Clickを実行しているスレッド)上で実行されます。 > mMainFrmを作成したスレッドは、btnFile_Clickメソッドが終了した後、 > OnRegisterFileメソッドを呼び出します。 > しかし、 > >> // ボタンクリック >> private void btnFile_Click ( object sender , EventArgs e ) >> { >> Thread th = new Thread( new ThreadStart( FileFindFunc ) ); >> th.Start(); >> >> th.Join(); // 終わるまで待つ。 >> } > > th.Join()しているので、 > btnFile_Clickメソッドは、FileFind.Find()メソッドが終わるまで待ちます。 > 一方、FileFind.Find()メソッドは、mMainFrm.Invokeを使っているので、 > OnRegisterFileメソッドの実行が終わるまで待機します。 > 前述のように、OnRegisterFileメソッドは、btnFile_Clickメソッドが終わるまで実行されません。 > > すなわち、お互いが永久に相手の終了を待ち続けている状態です。
分類:[.NET]