任务并行库和异常

时间:2012-04-16 08:34:41

标签: c# exception exception-handling task-parallel-library

我有一个正在执行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个任务都处于永无止境的循环中,因此永远不会达到上面的线程。第一个任务的代码示例:

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()方法永远不会再次执行。

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

2 个答案:

答案 0 :(得分:2)

发现你throw异常,因此异常在堆栈顶部传播并中断源线程的执行。

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

你可以使用一个事件来提升它,比如ExceptionCaught(..)并在你的程序中监听该事件。

答案 1 :(得分:1)

只需删除catch子句末尾的throw;即可。

来自MSDN

  

可以在catch块中使用throw语句来重新抛出   catch语句捕获的异常。

所以你要重新抛出捕获的异常,这会导致线程中断,再也不会再执行......

更多信息:What happens when a .NET thread throws an exception?