如何在主线程中处理线程异常,阻止所有工作者并在完成时通知他们?

时间:2010-07-09 09:48:04

标签: c# exception-handling multithreading

我在Windows服务器上记录programmaticaly后,有一个Windows服务做一些重复性的工作(wcf调用)。所有调用都是通过并行运行的各种线程调用的,但是如果连接丢失,或者iis回收,因此inproc会话管理指示我重新登录,我想处理这个异常,停止所有其他线程,将异常传播到主线程,重试登录,并在成功时通知所有线程重新启动。

我的主要应用程序如下所示。我登录,我启动两个工作程序,主线程中的异常处理机制正在等待:

        IFileManagerService fileManagerService = new FileManagerService();
        IJobManagerService  jobManagerService  = new JobManagerService();

        WindowsServiceSettings.AuthenticationService.Login(WindowsServiceSettings.Credentials.Split(':')[0], WindowsServiceSettings.Credentials.Split(':')[1]);

        WriteToLogFile("Service Started at " + DateTime.Now);

        fileManagerService.Start();
        jobManagerService.Start();

我可以通过等待句柄来实现这个吗?我将如何实现?

非常感谢!

2 个答案:

答案 0 :(得分:1)

首先,您需要一种在线程之间传播异常的方法。到目前为止,最简单的方法是让您的子线程成为Task个对象。然后,您可以为continuation执行这些任务,以检测其中是否有任何错误。

您需要的第二件事是取消其他线程的方法。使用具有相同CancellationToken的合作cancellation。当任务继续检测到错误时,它应该取消所有其他线程(并等待它们完成)。

从那里开始,让任务继续重新登录然后重新启动任务(包括将自己注册为新任务的任务延续)是一件简单的事情。

答案 1 :(得分:1)

对于.Net 3.5项目,我使用工作线程的回调方法来向主线程发出信号,告知存在问题。让每个工作者调用一个单独的“心跳”回调方法,该方法定期检查主线程是否允许继续;可以在其处理循环中从各个地方调用工作程序。

如果主线程收到错误回调,则可以设置heartbeat方法返回停止指示,让每个工作线程安全地自行停止。当worker停止时,让它调用终止回调,该回调传递线程的ManagedThreadId,主要从活动线程的集合中删除。一旦收集计数为零,那么所有工人都完成了。这避免了必须依赖Thread.Abort()。

如果需要,您可以使用心跳为每个活动线程重置计时器,如果工作人员挂起,它可以提醒主线程。心跳也可用于通过工作进度更新主线程。