我无法阻止线程

时间:2014-05-05 17:22:51

标签: c# multithreading

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

2 个答案:

答案 0 :(得分:6)

首先,退出应用程序只会结束该线程的消息循环。这不会直接拆除任何其他线程。

如果您希望退出此应用程序以结束此其他线程,那么您需要做的就是将其作为后台线程。 (将IsBackground属性设置为true。)当没有其他非后台线程正在运行时,线程将被拆除。

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

答案 1 :(得分:1)

尝试添加

backgroundThread.IsBackground = true;
在致电Start()

之前