マルチスレッドを使用してアプリケーションを作成しています。アプリケーションには、基本的に UI と、バックグラウンドで何らかの作業を行い、UI を更新するスレッドがあります。フォームを閉じると、フォームクローズ イベントで、ワーカー スレッドに停止を通知します。ただし、何らかの理由でブロックされ、何がブロックされたのかわかりません。以下は私の問題の簡略化されたコードです。実際のコードはもっと複雑です。
namespace CmdTest
{
public partial class Form1 : Form
{
Thread _workerThread;
static object _lock;
static bool _stopFlag;
public Form1()
{
_lock = new object();
_stopFlag = false;
_workerThread = new Thread(new ThreadStart(ThreadDoWork));
InitializeComponent();
_workerThread.Start();
}
delegate void UpdateUI();
public void UpdateUICallback()
{
//Doing stupid things
int i = 0;
while (i < 10000)
{
i++;
}
}
public void ThreadDoWork()
{
if (this.InvokeRequired)
{
UpdateUI updateUI = new UpdateUI(UpdateUICallback);
while (true)
{
//telling the UI thread to update UI.
this.Invoke(updateUI);
lock (_lock)
{
if (_stopFlag)
return;
}
}
}
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//tell the worker thread to terminate.
lock (_lock)
{
_stopFlag = true;
Monitor.Pulse(_lock);
}
while (!_workerThread.Join(0))
{
}
}
}
}
問題は、私が使用する場合です
lock (_lock)
{
_stopFlag = true;
Monitor.Pulse(_lock);
}
ボタン イベントでワーカー スレッドを停止するには、ワーカー スレッドは停止しますが、フォームを閉じるイベントでは停止しません。どんな助けでも大歓迎です。ありがとう。