C# 如何处理主线程中的线程异常,阻止所有工作人员并在完成后通知他们?

C# 如何处理主线程中的线程异常,阻止所有工作人员并在完成后通知他们?,c#,exception-handling,multithreading,C#,Exception Handling,Multithreading,在web服务器上记录programmaticaly之后,我有一个windows服务在做一些重复的工作(wcf调用)。所有调用都是通过独立并行运行的各个线程调用的,但如果例如,连接丢失,或iis回收,因此inproc会话管理会指示我重新登录,我希望处理此异常,停止所有其他线程,将异常传播到主线程,重试登录,成功后向所有线程发出重新启动的信号 我的主要应用程序如下所示。我登录,启动两个worker,主线程中的异常处理机制挂起: IFileManagerService fileMana

在web服务器上记录programmaticaly之后,我有一个windows服务在做一些重复的工作(wcf调用)。所有调用都是通过独立并行运行的各个线程调用的,但如果例如,连接丢失,或iis回收,因此inproc会话管理会指示我重新登录,我希望处理此异常,停止所有其他线程,将异常传播到主线程,重试登录,成功后向所有线程发出重新启动的信号

我的主要应用程序如下所示。我登录,启动两个worker,主线程中的异常处理机制挂起:

        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();
我可以通过等待句柄实现这一点吗?我将如何实现


多谢各位

首先,您需要一种跨线程传播异常的方法。到目前为止,最简单的方法是让您的子线程进入
Task
对象。然后,您可以为这些任务指定一个参数,以检测是否有任何任务出错

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


从这里开始,只需让任务继续重新登录,然后重新启动任务(包括将自身注册为新任务的任务继续)。

对于.Net 3.5项目,我将使用工作线程的回调方法向主线程发出有问题的信号。让每个工作线程调用一个单独的“heartbeat”回调方法,该方法定期检查主线程是否有继续的权限;工人可以从其处理循环中的不同位置调用

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

如果需要,您可以使用heartbeat为每个活动线程重置一个计时器,如果工作线程挂起,它可以向主线程发出警报。heartbeat还可以用于使用工作进程更新主线程