任务并行库和异常

本文关键字:异常 并行 任务 | 更新日期: 2023-09-27 18:31:10

我有一个并行执行 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() 方法将永远不会再次执行。

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

任务并行库和异常

因为您throw异常,因此异常会在堆栈顶部传播并中断源线程的执行。

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

您可以使用事件来引发它,例如,ExceptionCaught(..)并在程序中侦听该事件。

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

从 MSDN:

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

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

详细信息:当 .NET 线程引发异常时会发生什么情况?