我继承了多线程Windows服务(C#,.NET),不支持无法处理的异常。该服务使用多个线程从遥测设备收集数据进行分析。此服务中的线程可以运行24小时或更长时间。我正在努力解决如何告诉主线程线程遇到问题并需要回收。这是代码的简化视图:
class Program
{
static void Main(string[] args)
{
var workerObject = new WorkerObject();
var workerThread = new Thread(workerObject.DoWork);
workerThread.Start()
}
}
class WorkerObject
{
//todo: My fields and properties go here
public void DoWork()
{
const int timeout = 100;
//todo: setup wait handles here
try
{
//Start monitoring channels for this device
while (true)
{
// Wait on any waithandle or timeout once per decisecond.
int channelIndex = WaitHandle.WaitAny(waitHandles, timeout, false);
//todo: process incoming data for this channel
}
}
//Catch all exceptions so we can notify mommy that we're in a bad way
catch (Exception ex)
{
//todo: log anything that can help us figure this problem out
//How do I tell the main thread I've failed
}
finally
{
//But of course we want to clean up after ourselves
}
}
}
这是否是最好的.NET线程机制?我应该使用异步代理还是任务并行库?
答案 0 :(得分:2)
我最近有类似的要求。我不认为你可以依赖子线程告诉父母他们是坏人。如果由于某种原因陷入无限循环或陷入僵局会怎么样?我选择了“看门狗”的方法。每个子线程都需要将“心跳”发送回主线程。如果没有收到这个信号,那么该线程被认为是“死亡”并且可以采取行动。这是一篇关于我定居的建筑的帖子:
http://blog.bobcravens.com/2009/08/monitored-watchdog-asynchronous-process-in-c/
希望这有帮助。
鲍勃
答案 1 :(得分:0)
Daniel Moth在博客上写了很多关于多线程的文章,最近在.net 4.0中支持了Parallel Tasks支持。这是一个很好的资源,http://www.danielmoth.com非常有趣。我肯定会检查出来。
我不确定这是否有帮助,但我在“Report Runner”Windows服务上工作,该服务从队列中获取作业,然后在ThreadPool上安排工作;这很好用,因为如果“报告”失败,我只记录错误并退出该函数,因为它是在ThreadPool中安排的,它只是返回池中运行更多报告。如果您运行的代码失败,使用ThreadPool可以避免管理启动新线程所需的代码。