開始ボタンとキャンセル ボタンを備えた GUI インターフェイスがあります。開始後、GUI スレッドであるメイン スレッドは、実際の作業を行う 2 番目のスレッドを作成します。キャンセルボタンを押すと、作業スレッドに作業を停止して終了するように指示するブール値が設定されるだけです。問題は、作業スレッドが作業を終了したと確信しているにもかかわらず、メインの GUI スレッドがスタックしたままになることです。何故ですか?
コードの一部を次に示します。
private Thread workerThread;
private SomeClass fs;
private void buttonSearch_Click(object sender, EventArgs e)
{
//do some initializations
fs = new SomeClass();
workerThread = new Thread(fs.WorkMethod);
workerThread.Start();
}
private void buttonCancel_Click(object sender, EventArgs e)
{
fs.StopWork();
workerThread.Join();
}
inside SomeClass:
private bool keepWorking;
public void StopWork()
{
keepWorking= false;
}
public void WorkMethod()
{
if (keepWorking)
{
//do some stuff with recursion
}
}
join を呼び出した後にメインスレッドが起動しない理由を誰かが知っていますか? keepWorking 変数を手動で false に変更し、メソッドが最後に到達した場合にどうなるかを確認するために、デバッグも試みました。