任务并行库和异常
本文关键字:异常 并行 任务 | 更新日期: 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 线程引发异常时会发生什么情况?