线程终止在C#

问题描述:

我写了一个C#程序通过backgndWorkerEnroll_DoWork这反过来又通过一个线程调用另一个函数来调用一个函数。第一次启动线程后,该功能正常工作。我然后使用thread.Abort()方法终止线程并再次调用thread.Start()方法。前面的函数调用仍然有效,但不会中止。我如何强制关闭线程?线程终止在C#

public int capture() 
{ 
    System.Threading.Thread thEnroll = new System.Threading.Thread(delegate() 
    { 
     // winbio.OpenSession1(); 
     refresult1 = winbio.Enroll1(finger, false, refresult); 
     //winbio.Enroll1(finger, false, refresult, out refresult1); 
    }); 

    thEnroll.Name = "thEnroll"; 
    thEnroll.Start(); 
    while (true) 
    { 
     if (!thEnroll.IsAlive) 
      break; 
    } 
    thEnroll.Abort(); 
    return result; 
} 

private void backgndWorkerEnroll_DoWork(object sender, DoWorkEventArgs e) 
{ 
    capture(); 
} 

还有一个query.how强制关闭backgroundDo_Work通过按钮单击事件。

+3

这不是一般的工作,指纹读取器将几乎总是被埋没非托管代码中,等待司机吐的东西了。像这样的代码不能被中止,只有托管代码可以被CLR安全地中断。你将需要一个单独的进程,你可以杀死()。 – 2013-03-18 12:17:33

+0

是什么在等待,直到线程是死点(尝试)杀呢?你为什么要在可能需要几秒钟的操作上进行spinlock? – MattW 2013-03-18 12:28:59

+0

高度相关:[如何停止无响应的线程?](http://*.com/questions/11798080/how-to-stop-a-non-responsive-thread/11798203#11798203)...短版本:'Thread.Abort'受到了阻碍,你无法真正相信它离开你的应用程序域的状态。找到另一种方式。 :P – cHao 2013-03-18 12:51:53

现在看来似乎并没有得到你的中止行动,因为你有无限循环:

while (true) 
{ 
    // This will run forever 
    if (!thEnroll.IsAlive) 
     break; 
} 

这个循环从精加工阻塞线程。
也是你的植入似乎不可思议,如果线程是不是还活着,你不必放弃它..

+7

岂不的Thread.join()做同样的,因为他与他的while循环尝试? – 2013-03-18 12:20:49

+0

@lorenzalbert我同意。 – 2013-03-18 12:49:42

我没那么熟悉multithreading,所以纠正我,如果我错了......但是,从我明白的是,一旦Thread已被中止,它不能再次启动。这也许可以解释你所遇到的行为(EI正常工作的第一次,但不是thread停止firt时间后)

我一派thread.abortthread.joinsee this

如果调用之间的区别Thread.Join取而代之的是,线程将exit很好,而不是投掷ThreadAbortedException该网站还表示,在您致电abort后,您还应该致电join或处理ThreadAbortedException来做到这一点。