2012-04-16 52 views
1

我有一个应用程序正在并行执行4个不同的作业。我使用并行任务库。任务并行库和异常

的代码看起来是这样的:

while (true) 
     { 
      var fetch = new FetcherHandler(); 

      var tasks = new Task[4]; 

      tasks[0] = Task.Factory.StartNew(fetch.GetJobs); 

      tasks[1] = Task.Factory.StartNew(fetch.GetStatusNew); 

      tasks[2] = Task.Factory.StartNew(fetch.GetJobsForStatus); 

      tasks[3] = Task.Factory.StartNew(fetch.GetStatusOld); 
      Task.WaitAll(tasks); 

      Thread.Sleep(10000); 
     } 

上述绝不会因为所有这些4个任务达成Thread.sleep代码是永无止境的循环。代码示例的第一个任务:

public void GetJobs() 
     { 
    while (true) 
      { 
       try 
        { 
         handler.GetNewJob(); 
         } 
        catch (Exception exception) 
        { 
          var mail = new MailService(); 
          mail.SendExeption("Error has accured in GetJobs", exception); 
          throw; 
         } 
        } 
       } 
       Thread.Sleep(15000); }} 

上面的代码的伟大工程,它做了一些工作,然后睡15秒,然后再次做它。出现异常时会出现此问题。

异常被捕获并且给我发送了一封邮件,但是在异常之后,thred不会在循环中继续,所以GetNewJob()方法将永远不会再被执行。

任何想法异常命中时线程会发生什么,以及如何“保存”线程以使其可以继续?

+0

与您的问题无关,但等待无休止的任务有什么意义? – hvd 2012-04-16 08:39:24

回答

2

Becasue你throw异常,所以异常的传播堆栈顶部并中断源线程的执行。

catch (Exception exception) 
{ 
    var mail = new MailService(); 
    mail.SendExeption("Error has accured in GetJobs", exception); 
    throw; //THIS LINE ! 
} 

您可以使用一个事件来提高,比方说,ExceptionCaught(..),听你的程序内部的事件。

+0

谢谢!你知道这个抛出是否会杀死整个应用程序或者只有线程? – Fore 2012-04-16 08:57:11

+0

寻找所提供的代码,它会杀死应用程序 – Tigran 2012-04-16 09:02:07