gpt4 book ai didi

c# - 处理任务并行库中的异常

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:06 25 4
gpt4 key购买 nike

我从 COLIN Mackay 的博客上的这篇文章中获得了以下代码。 Tasks that throw exceptions正如本文所建议的那样,任务中抛出的异常不会冒泡,除非调用了 Wait... 方法(不包括 WaitAny)之一。 我有 2 个类似的场景,它们给出了两个不同的结果。

第一个场景

  1. 注释掉下面的部分(先注释掉这个)
  2. 不评论(此时评论)下的部分
  3. 使用 ctrl+f5 运行控制台应用程序,这样调试器就不会因异常而中断。
    1. 观察即使任务抛出异常,除非调用 wait 方法,否则异常不会冒泡。(按 enter 两次调用 wait 方法)

First Scenario

第二种情况

  1. 注释掉下面的部分(马上评论)
  2. 留下(先评论这个)下面的部分不评论
  3. 使用 ctrl+f5 运行控制台应用程序,这样调试器就不会因异常而中断。
    1. 现在也没有冒泡异常,但不同之处在于任务没有启动,因为控制台不会将任务状态显示为第一种情况,即使两者都抛出异常。有人可以解释这种行为以及两种异常之间的区别吗。

second scenario这是代码。

using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Threading
{
class Program
{
static void Main(string[] args)
{
// Start the tasks
List<Task> tasks = new List<Task>();
for (int i = 0; i < 20; i++)
{
Task t = Task.Factory.StartNew(PerformTask);
tasks.Add(t);
}

Console.WriteLine("Press enter to display the task status.");
Console.ReadLine();

// Display the status of each task.
// If it has thrown an exception will be "faulted"
foreach (Task t in tasks)
Console.WriteLine("Task {0} status: {1}", t.Id, t.Status);

Console.WriteLine("Press enter to wait for all tasks.");
Console.ReadLine();

// This is where the AggregateException is finally thrown
Task.WaitAll(tasks.ToArray());

Console.ReadLine();
}

public static void PerformTask()
{
//comment this first
//string input = null;
//string output = input.ToUpper();
Console.WriteLine("Starting Task {0}", Task.CurrentId);
//comment this second
throw new Exception("Throwing exception in task " + Task.CurrentId);
}
}
}

最佳答案

the diffrence is that the tasks didnt start as the console doesn't display the status of the task as the first scenario

那是因为第二次,在您的 Console.WriteLine 方法调用之前抛出异常:

string input = null;
string output = input.ToUpper(); // this will throw
Console.WriteLine("Starting Task {0}", Task.CurrentId);

对比:

Console.WriteLine("Starting Task {0}", Task.CurrentId); // This will first be written
throw new Exception("Throwing exception in task " + Task.CurrentId);

如果您想体验相同的行为,请在您的方法开始时向控制台写入:

public static void PerformTask()
{
Console.WriteLine("Starting Task {0}", Task.CurrentId);

//string input = null;
//string output = input.ToUpper();

throw new Exception("Throwing exception in task " + Task.CurrentId);
}

关于c# - 处理任务并行库中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29966779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com