【发布时间】:2014-03-19 16:45:40
【问题描述】:
我正在开发一个应用程序,它会定期轮询 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() 必须等到其常规超时才能退出。
有什么更好的方法来实现这一点并避免在错误的地方中断工作线程?
【问题讨论】:
-
如果您的服务所做的只是睡眠并定期轮询,那么它应该是计划任务而不是服务。见Programs are not cats。
标签: .net multithreading httpwebrequest webrequest