我有以下代码,即使我关闭表单或退出程序,线程也不会停止System.Windows.Forms.Application.Exit();.
我的代码:
bool shouldStop = false;
private void button1_Click(object sender, EventArgs e)
{
backgroundThread = new Thread(
new ThreadStart(() =>
{
for (int j = 0; j <= 1000; j++)
{
if (!shouldStop)
{
//do something
}
else
{
break;
}
}
}));
backgroundThread.Start();
}
private void FormUpdateDB_FormClosing(object sender, FormClosingEventArgs e)
{
shouldStop = true;
}
Run Code Online (Sandbox Code Playgroud)
首先,退出应用程序只是结束该线程的消息循环.这不会直接拆除任何其他线程.
如果您希望退出此应用程序以结束此其他线程,那么您需要做的就是将其作为后台线程.(将IsBackground属性设置为true.),当没有其他非后台线程正在运行时,线程将被拆除.
至于为什么线程一直会照顾你设置shouldStop到true,你是不是正确同步访问的变量.因为没有内存屏障,所以另一个线程可以自由地继续读取该变量的缓存值,只要它想要.虽然您可以自己同步访问,但您不应该尝试.相反,如果这个线程是非后台线程很重要(因为它正在做一些无法在某个任意时间点停止的东西),那么你应该使用a CancellationToken来合作取消另一个任务.该类型的实现可以正确地同步对线程之间的数据的访问.