Thread.Interrupt不起作用

3

为什么我的Thread.Interrupt无法正常工作?

执行中断操作的代码:

public void Stop()
{
    const string LOG_SOURCE = "ProcessingDriver";

    if (_Enabled)
    {
        try
        {
            RequestProcessor.Disable();
            if (ProcessingThread != null)
            {
                ProcessingThread.Interrupt();
                ProcessingThread.Join();
            }
        }
        catch (Exception ex)
        {
            WriteLog(LOG_SOURCE, ex);
        }
    }
}

我希望停止的代码:

private void ProcessRequests()
{
    const string LOG_SOURCE = "ProcessRequests";
    try
    {
        ProcessingThread = Thread.CurrentThread;
        while (!_Disposed)
        {
            _ProcessingWaitHandle.WaitOne();
            int count = GetRequestCount();
            while (count > 0)
            {
                try
                {
                    ExportRequest er = GetRequest();
                    ProcessRequest(er);
                }
                catch (ThreadInterruptedException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    WriteLog(LOG_SOURCE,
                         ex);
                    WriteLog(LOG_SOURCE,
                        "Request Failed.");
                }
                //Suspend to catch interupt
               Thread.Sleep(1);
                count = GetRequestCount();
            }
        }
    }
    catch (ThreadInterruptedException)
    {
        WriteLog(LOG_SOURCE,
            "Interupted. Exiting.", LogType.Info);
    }
    catch (Exception critEx)
    {
        //Should never get here
        WriteLog(LOG_SOURCE, critEx);
        WriteLog(LOG_SOURCE,
            "Serious unhandled error.  Please restart.", LogType.Critical);
    }
}

我已经仔细阅读了代码。我可以看到Interrupt被调用了(此时Sleep或Wait不是活动命令),我也可以看到Sleep被调用,但是从来没有抛出Interrupt错误(即使线程在WaitOne上阻塞时也没有)。

我做错了什么?

注意:.Net 2.0


+1 表示清晰透彻和披露。 - Ben S
1个回答

3

嗯...看起来应该是可以工作的,但我建议你不要首先使用Interrupt。使用事件和/或Monitor.Wait/Pulse来告诉线程你想要停止。这是一种通常更简单的方法,并且可以使工作线程更有序地控制停止。


我喜欢中断方法,因为它会自动退出我的_ProcessingWaitHandle.WaitOne()。 - C. Ross
2
Jon是正确的。原因在这里:http://www.bluebytesoftware.com/blog/PermaLink,guid,c3e634ac-4aa1-44eb-a744-02d6ed4de514.aspx - Craig Stuntz
C. Ross:等待句柄的意义在于,您可以设置它而不仅仅是中断线程... - Jon Skeet
@Jon:但是由于我已经在一个等待句柄上阻塞,所以我必须从那个句柄中出来,检查我的新的“TimeToQuit”等待句柄。本质上,我必须在两个句柄之间轮询。 - C. Ross
2
@C. Ross:WaitHandle.WaitAny() 怎么样? - Chris W. Rea
@cwrea:好主意。之后我仍然需要检查一个标志来确定是否应该退出,但这个方法可行。 - C. Ross

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接