簡體   English   中英

任務並行庫和異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM