代码之家  ›  专栏  ›  技术社区  ›  Aggelos Biboudis

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

  •  1
  • Aggelos Biboudis  · 技术社区  · 14 年前

    我有一个windows服务在web服务器上记录programmaticaly之后做一些重复的工作(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();
    

    非常感谢你!

    2 回复  |  直到 14 年前
        1
  •  1
  •   Stephen Cleary    14 年前

    首先,需要一种跨线程传播异常的方法。到目前为止,最简单的方法是让您的子线程 Task continuation 检测是否有错误。

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

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

        2
  •  1
  •   Ed Power    14 年前

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