2010-08-22 68 views
11

我有一个单线程,它有一个运行线程用于从服务器获取记录。 但是,当我停止我的winform应用程序线程继续运行。我试图在单例中创建一个析构函数来中止该线程(如果它正在运行),但它对线程没有任何影响 - 我知道析构函数正在被唤起。当我的winform应用程序关闭时,我该如何停止线程

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

C#,.NET2

+0

可能重复[?如何停止的BackgroundWorker在窗体的Closing事件(http://stackoverflow.com/questions/1731384/how-to-stop- backgroundworker-on-forms-closing-event) – 2010-08-22 15:43:17

+0

我看着你的链接消化...它没有为我做一件事 – fishhead 2010-08-22 15:46:14

回答

9

最好的选择,如果可能的话在你的应用程序,是合作取消。

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

否则,你可以推出自己的解决方案,例如

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; 
     } 
    } 
} 
54

一个线程可以是:

  • 前景:将永葆你的程序,直到它完成。
  • 背景:关闭应用程序时将终止。

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

你可以改变这样的:

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

当窗体关闭时后台线程是否结束?例如,假设我有多个表单,并且在一种表单中有一个线程。当表单关闭时,即使线程处于无限循环,线程也会终止吗?或者当应用程序退出时(当Main完成处理时)该线程结束? – JT9 2015-10-28 14:56:41

+0

@ JT9我刚刚测试过它,后台线程不会在多表单应用程序中关闭表单时结束。 – tunafish24 2016-07-14 08:24:54

相关问题