Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 任务并行库与异常_C#_Exception_Exception Handling_Task Parallel Library - Fatal编程技术网

C# 任务并行库与异常

C# 任务并行库与异常,c#,exception,exception-handling,task-parallel-library,C#,Exception,Exception Handling,Task Parallel Library,我有一个并行执行4个不同作业的应用程序。我使用并行任务库 代码如下所示: while (true) { var fetch = new FetcherHandler(); var tasks = new Task[4]; tasks[0] = Task.Factory.StartNew(fetch.GetJobs); tasks[1] = Task.Factory.StartNe

我有一个并行执行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秒,然后再做一次。当我遇到异常时,问题就出现了

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


你知道当异常发生时线程会发生什么情况,以及我如何“保存”线程以便它可以继续吗?

只需删除
抛出在catch子句的末尾

发件人:

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

因此,您正在重新触发捕获的异常,这会导致线程中断,不再执行


更多信息:

因为您
抛出了一个异常,所以异常会在堆栈顶部传播,并中断源线程的执行

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

你可以使用一个事件来引发它,比如说,
异常caught(…)
,并在你的程序中倾听该事件。

与你的问题无关,但等待无休止的任务有什么意义?谢谢!你知道这个抛出是杀死整个应用程序还是只杀死线程?