首页 文章

什么是阻止此工作线程的更好方法?

提问于
浏览
0

我正在开发一个应用程序,它定期轮询Web服务以获取某些数据 . 应用程序必须作为Windows服务运行,因此必须以异步方式启动和停止 . 我正在使用线程 .

工作线程的主循环以这种方式运行:

bool stop = false;
int interval = 60000;    // 60 seconds, customizable

while(!stop)
{
    try
    {
        // Query the web service using a WebRequest
    }
    catch(Exception e)
    {
        // Handle exception
    }

    // Process data

    try
    {
        Thread.Sleep(interval);
    }
    catch(ThreadInterruptedException)
    {}
}

要停止工作线程,我从控制线程执行此操作:

stop = true;
workerthread.Interrupt();
workerthread.Join();

这非常有效...除非在调用 Thread.Interrupt() 时,工作线程碰巧正在执行(或尚未执行)Web请求;在这种情况下,实际中断的是Web请求(可能是自己睡觉),下一个 Sleep() 必须等到其常规超时才能退出 .

有什么更好的方法来实现这一点并避免在错误的地方中断工作线程?

1 回答

  • 2

    使用 MaualResetEvent

    在启动线程的类中:

    ManualResetEvent evt = new ManualResetEvent(false);
    

    然后将您的代码修改为:

    int interval = 60000;    // 60 seconds, customizable
    
    while(evt.WaitOne(interval))
    {
        try
        {
            // Query the web service using a WebRequest
        }
        catch(Exception e)
        {
            // Handle exception
        }
    
        // Process data
    }
    

    要停止该线程,只需调用 evt.Set();

    即使它处于60秒等待的中间,这也会导致线程停止 .

相关问题