[英]Task Parallel Library and exception
我有一個正在執行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秒,然后再做一次。 當我得到異常時會出現問題。
異常被捕獲並向我發送郵件,但是異常后循環不會繼續循環,因此GetNewJob()方法將永遠不會再次執行。
任何想法在異常命中時線程會發生什么,以及我如何“保存”線程以便它可以繼續?
因為throw
異常,異常會在堆棧頂部傳播並中斷源線程的執行。
catch (Exception exception)
{
var mail = new MailService();
mail.SendExeption("Error has accured in GetJobs", exception);
throw; //THIS LINE !
}
你可以使用一個事件來引發它,例如, ExceptionCaught(..)
並在程序中監聽該事件。
只需刪除throw;
在你的catch子句的末尾。
來自MSDN :
可以在catch塊中使用throw語句來重新拋出catch語句捕獲的異常。
所以你要重新拋出捕獲的異常,這會導致線程中斷,永遠不再執行...
更多信息: 當.NET線程拋出異常時會發生什么?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.