我编写了一个C#程序,通过backgndWorkerEnroll_DoWork
调用一个函数,然后通过一个线程调用另一个函数。我第一次启动线程后,该功能正常工作。然后我使用thread.Abort()
方法中止线程并再次调用thread.Start()
方法。之前的函数调用仍然有效,它不会中止。如何强制关闭线程?
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();
}
还有一个查询。通过按钮点击事件强制关闭backgroundDo_Work。
答案 0 :(得分:3)
由于你有无限循环,似乎没有进入你的中止行动:
while (true)
{
// This will run forever
if (!thEnroll.IsAlive)
break;
}
此循环阻止线程完成。
你的植入也很奇怪,如果线程没有活着,你就不需要中止了它。
答案 1 :(得分:0)
我对multithreading
并不熟悉,所以如果我错了就纠正我......但据我所知,一旦Thread
被中止,它就无法再次启动。这可能会解释您遇到的行为(例如,它在第一次工作正常,但在thread
停止的第一次之后却没有。
我用Google搜索thread.abort
和thread.join
之间的差异(see this)
如果您拨打Thread.Join
,该主题将exit
很好地而不是抛出ThreadAbortedException
网站也说的是,在您致电abort
后,您还应该致电join
,或处理ThreadAbortedException
来做到这一点。