Я пишу приложение, используя многопоточность. Приложение в основном имеет пользовательский интерфейс и поток, выполняющий некоторую работу в фоновом режиме и обновляющий пользовательский интерфейс. Когда я закрываю форму, в событии закрытия формы я уведомляю рабочий поток об остановке. Однако по некоторым причинам он блокируется, и я понятия не имею, что вызвало его блокировку. Ниже приведен упрощенный код моей проблемы, мой реальный код сложнее.
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);
}
чтобы остановить рабочий поток в событии кнопки, рабочий поток остановится, но не в событии закрытия формы. Любая помощь будет оценена по достоинству. Спасибо.