当我的winform应用程序关闭时,我该如何停止线程
我有一个单线程,它有一个运行线程用于从服务器获取记录。 但是,当我停止我的winform应用程序线程继续运行。我试图在单例中创建一个析构函数来中止该线程(如果它正在运行),但它对线程没有任何影响 - 我知道析构函数正在被唤起。当我的winform应用程序关闭时,我该如何停止线程
我正在寻找关于如何在应用程序关闭时关闭线程的建议。 感谢
C#,.NET2
最好的选择,如果可能的话在你的应用程序,是合作取消。
线程在没有更多代码执行时自动停止。所以,当用户关闭你的应用程序时,你设置了一个标志,表明你的线程应该停止。线程需要不时检查标志是否设置,如果是,则停止从服务器获取记录并返回。
- 正如@Hans Passant指出的那样,BackgroundWorker已经内置了对此的支持。
- 如果可以升级,.NET Framework 4.0引入了一整套支持cooperative cancellation of asynchronous operations的新类。
否则,你可以推出自己的解决方案,例如
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();
的
当窗体关闭时后台线程是否结束?例如,假设我有多个表单,并且在一种表单中有一个线程。当表单关闭时,即使线程处于无限循环,线程也会终止吗?或者当应用程序退出时(当Main完成处理时)该线程结束? – JT9 2015-10-28 14:56:41
@ JT9我刚刚测试过它,后台线程不会在多表单应用程序中关闭表单时结束。 – tunafish24 2016-07-14 08:24:54
可能重复[?如何停止的BackgroundWorker在窗体的Closing事件(http://stackoverflow.com/questions/1731384/how-to-stop- backgroundworker-on-forms-closing-event) – 2010-08-22 15:43:17
我看着你的链接消化...它没有为我做一件事 – fishhead 2010-08-22 15:46:14