我可以';t停止线程

本文关键字:线程 我可以 | 更新日期: 2023-09-27 18:01:51

我有以下代码,即使我关闭窗体或使用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;
}

我可以';t停止线程

因此,首先,从应用程序退出只会结束线程的消息循环。这不会直接破坏任何其他线程。

如果你想让这个应用程序的退出结束另一个线程,那么你所需要做的就是让它成为一个后台线程。(将IsBackground属性设置为true。(当没有其他非后台线程运行时,线程将被拆除。

至于为什么在将shouldStop设置为true之后线程仍在运行,则是因为您没有正确同步对变量的访问。因为没有内存障碍,所以其他线程可以自由地继续读取该变量的缓存值,只要它愿意。虽然你可以自己同步访问,但你不应该尝试。相反,如果这个线程是一个非后台线程很重要(因为它正在做一些无法在任意时间点停止的事情(,那么您应该使用CancellationToken来协同取消另一个任务。该类型的实现正确地同步线程之间对数据的访问。

尝试添加

backgroundThread.IsBackground = true;

调用Start() 之前