当winform应用程序关闭时,如何停止线程

我有一个单例,它有一个运行线程,用于从服务器获取记录。 但是,当我停止我的winform应用程序时,线程继续运行。 我试图在我的单例中创建一个析构函数,以便在线程运行时中止该线程,但它对线程没有任何影响 – 我知道析构函数是被引发的。

我正在寻找关于如何在我的应用程序关闭时关闭线程的建议。 谢谢

C#,。net2

如果可能,在您的申请中,最佳选择是合作取消。

当没有更多代码要执行时,线程会自动停止。 因此,当用户关闭您的应用程序时,您设置一个标志,指示您的线程应该停止。 线程需要不时检查是否设置了标志,如果是,则停止从服务器获取记录并返回。

  • 正如@Hans Passant所说, BackgroundWorker已经为此提供了内置支持。
  • 如果可以升级,.NET Framework 4.0引入了一整套支持异步操作协同取消的新类。

否则,您可以滚动自己的解决方案,例如

static bool isCancellationRequested = false; static object gate = new object(); // request cancellation lock (gate) { isCancellationRequested = true; } // thread for (int i = 0; i < 100000; i++) { // simulating work Thread.SpinWait(5000000); lock (gate) { if (isCancellationRequested) { // perform cleanup if necessary //... // terminate the operation break; } } } 

一个线程可以是:

  • 前景:将一直保持你的程序,直到它完成。
  • 背景:关闭您的申请时将终止。

创建线程时,默认情况下它是前台线程。

你可以改变这样:

 Thread t = new Thread(myAction); t.IsBackground = true; t.Start();