C# 如何在调用Task.WaitAll之前提醒异常?

C# 如何在调用Task.WaitAll之前提醒异常?,c#,.net,async-await,task-parallel-library,C#,.net,Async Await,Task Parallel Library,就我而言,我通过以下方式创建任务: IList<Task> Tasks = new List<Task>(); Tasks.Add(Task.Run(async () => { await functionAsync();})); IList Tasks=new List(); Tasks.Add(Task.Run(async()=>{await functionsync();})); 我需要无限期地运行这些任务,以便不断地处理一些传入的数据。但是,如果发生一些

就我而言,我通过以下方式创建任务:

IList<Task> Tasks = new List<Task>();
Tasks.Add(Task.Run(async () => { await functionAsync();}));
IList Tasks=new List();
Tasks.Add(Task.Run(async()=>{await functionsync();}));
我需要无限期地运行这些任务,以便不断地处理一些传入的数据。但是,如果发生一些致命错误/异常,我需要通过取消所有任务来结束程序。我放了一个简单的例子来模拟我打算做的事情,但它不起作用。我认为当抛出异常时,任务将被视为结束,WaitAny应该返回AggregateException,但它似乎不是实际工作的方式。那么,我怎样才能使它正确呢

public static void Main(string[] args)
{
    Console.WriteLine(nameof(Main));
    for (int i = 1; i < 5; i++)
    {
        var i1 = i;
        _tasks.Add(Task.Run(async () => { await Tryme(i1); }));
    }

    try
    {
        Task.WaitAny(_tasks.ToArray());
    }
    catch (Exception e)
    {
        Console.WriteLine("Stop my program if any of the task in _tasks throw exception");
        Console.WriteLine(e);
    }
    Console.ReadLine();
}

private static async Task Tryme(int i)
{

    Console.WriteLine($"I'm {i}");
    if (i == 3)
    {
        Console.WriteLine($"{i} is throwing the exception");
        throw new Exception("fake one");
    }
    await Task.Delay(TimeSpan.MaxValue);
}
publicstaticvoidmain(字符串[]args)
{
Console.WriteLine(主控制台的名称);
对于(int i=1;i<5;i++)
{
var i1=i;
_tasks.Add(Task.Run(async()=>{await-Tryme(i1);}));
}
尝试
{
Task.WaitAny(_tasks.ToArray());
}
捕获(例外e)
{
WriteLine(“如果_tasks中的任何任务引发异常,请停止我的程序”);
控制台写入线(e);
}
Console.ReadLine();
}
专用静态异步任务Tryme(int i)
{
Console.WriteLine($“I{I}”);
如果(i==3)
{
WriteLine($“{i}正在抛出异常”);
抛出新异常(“假异常”);
}
等待任务延迟(TimeSpan.MaxValue);
}
从中得到一些线索。看来WaitAny不会抛出任何异常。我得到的例外是:

int faultIndex = Task.WaitAny(_tasks.ToArray());
if (_tasks[faultIndex].IsFaulted)
{
     Console.WriteLine($"{faultIndex} end");
     throw _tasks[faultIndex].Exception;
}

如果发生未处理的异常,您可以使用以下命令代替手动取消整个任务链,或者可以将其配置为在需要时在中运行:

var actionBlock = new ActionBlock<int>(i => TryMe(i));

foreach (var num in Enumerable.Range(0, 100))
{
   actionBlock.Post(num);
}

try
{
   await actionBlock.Completion();
}
catch (Exception e)
{
    // Block finished prematurely, handle exception.
}
var actionBlock=newactionblock(i=>TryMe(i));
foreach(可枚举范围(01100)中的var num)
{
actionBlock.Post(num);
}
尝试
{
等待actionBlock.Completion();
}
捕获(例外e)
{
//块过早完成,处理异常。
}
注意:Dataflow为您处理Parralization,无需手动创建任务