c#中的线程中止

时间:2013-03-18 12:11:44

标签: c# multithreading backgroundworker

我编写了一个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。

2 个答案:

答案 0 :(得分:3)

由于你有无限循环,似乎没有进入你的中止行动:

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

此循环阻止线程完成。
你的植入也很奇怪,如果线程没有活着,你就不需要中止了它。

答案 1 :(得分:0)

我对multithreading并不熟悉,所以如果我错了就纠正我......但据我所知,一旦Thread被中止,它就无法再次启动。这可能会解释您遇到的行为(例如,它在第一次工作正常,但在thread停止的第一次之后却没有。

我用Google搜索thread.abortthread.join之间的差异(see this

如果您拨打Thread.Join,该主题将exit很好地而不是抛出ThreadAbortedException网站也说的是,在您致电abort后,您还应该致电join,或处理ThreadAbortedException来做到这一点。