我正在开发一个应用程序,它定期轮询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()
必须等到常规超时退出。
有什么更好的方法来实现这一点,并避免在错误的地方中断工作线程?
答案 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秒等待的中间,这也会导致线程停止。