我正在开发一个应用程序,它定期轮询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 回答
使用
MaualResetEvent
:在启动线程的类中:
然后将您的代码修改为:
要停止该线程,只需调用
evt.Set();
即使它处于60秒等待的中间,这也会导致线程停止 .