1

我有一个并行执行 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);
        }

上面的 thread.Sleep 永远不会到达,因为所有这 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 秒,然后它又做了一次。当我遇到异常时,就会出现问题。

异常被捕获了,并给我发送了一封邮件,但异常后线程不会在循环中继续,因此 GetNewJob() 方法将永远不会再次执行。

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

4

2 回答 2

2

因为你throw是一个异常,所以异常在堆栈顶部传播并中断源线程的执行。

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

你可以使用一个事件来引发它,比如说,ExceptionCaught(..)并在你的程序中监听那个事件。

于 2012-04-16T08:37:51.710 回答
1

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

来自MSDN

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

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

更多信息:当 .NET 线程抛出异常时会发生什么?

于 2012-04-16T08:36:50.257 回答