我正在使用多线程编写应用程序。该应用程序基本上有一个 UI 和一个在后台执行一些工作并更新 UI 的线程。当我关闭表单时,在 formclosure 事件中,我通知工作线程停止。但是,由于某些原因,它阻塞了,我不知道是什么原因导致它阻塞。下面是我的问题的简化代码,我的实际代码更复杂。
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);
}
要在按钮事件中停止工作线程,工作线程将停止但不会在表单关闭事件中停止。任何帮助,将不胜感激。谢谢。