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

时间:2014-03-19 16:45:40

标签: .net multithreading httpwebrequest webrequest

我正在开发一个应用程序,它定期轮询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 个答案:

答案 0 :(得分: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秒等待的中间,这也会导致线程停止。