我有一个正在执行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()方法永远不会再次执行。
任何想法在异常命中时线程会发生什么,以及如何“保存”线程以便它可以继续?
答案 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语句捕获的异常。
所以你要重新抛出捕获的异常,这会导致线程中断,再也不会再执行......