线程终止在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通过按钮单击事件。
现在看来似乎并没有得到你的中止行动,因为你有无限循环:
while (true)
{
// This will run forever
if (!thEnroll.IsAlive)
break;
}
这个循环从精加工阻塞线程。
也是你的植入似乎不可思议,如果线程是不是还活着,你不必放弃它..
岂不的Thread.join()做同样的,因为他与他的while循环尝试? – 2013-03-18 12:20:49
@lorenzalbert我同意。 – 2013-03-18 12:49:42
我没那么熟悉multithreading
,所以纠正我,如果我错了......但是,从我明白的是,一旦Thread
已被中止,它不能再次启动。这也许可以解释你所遇到的行为(EI正常工作的第一次,但不是thread
停止firt时间后)
我一派thread.abort
和thread.join
(see this)
如果调用之间的区别Thread.Join
取而代之的是,线程将exit
很好,而不是投掷ThreadAbortedException
该网站还表示,在您致电abort
后,您还应该致电join
或处理ThreadAbortedException
来做到这一点。
这不是一般的工作,指纹读取器将几乎总是被埋没非托管代码中,等待司机吐的东西了。像这样的代码不能被中止,只有托管代码可以被CLR安全地中断。你将需要一个单独的进程,你可以杀死()。 – 2013-03-18 12:17:33
是什么在等待,直到线程是死点(尝试)杀呢?你为什么要在可能需要几秒钟的操作上进行spinlock? – MattW 2013-03-18 12:28:59
高度相关:[如何停止无响应的线程?](http://*.com/questions/11798080/how-to-stop-a-non-responsive-thread/11798203#11798203)...短版本:'Thread.Abort'受到了阻碍,你无法真正相信它离开你的应用程序域的状态。找到另一种方式。 :P – cHao 2013-03-18 12:51:53