C# 任务何时使用

C# 任务何时使用,c#,C#,我有一系列任务,定义如下: Task t1 = new Task( () => { /* Do Something */ } ); Task t2 = new Task( () => { /* Do Something */ } ); Task t3 = new Task( () => { /* Do Something */ } ); Task t4 = new Task( () => { /* Do Something */ } ); List<Task>

我有一系列任务,定义如下:

Task t1 = new Task( () => { /* Do Something */ } );
Task t2 = new Task( () => { /* Do Something */ } );
Task t3 = new Task( () => { /* Do Something */ } );
Task t4 = new Task( () => { /* Do Something */ } );

List<Task> allTasks = new List<Task>();
allTasks.Add(t1);
allTasks.Add(t2); etc.
我对上述代码的问题:

这是使用任务的正确方法吗

Task.WhenAll()
自己启动任务,还是必须显式启动任务。如果是这样的话,我们是否先开始,然后再执行
任务。WhenALL()

我还需要对这些任务进行异常处理,请您建议处理任务中异常的正确方法,理想情况下,如果发生异常,我希望任务将一些诊断信息写入文本文档

我对任务世界有点陌生,谢谢你的帮助

Task.WhenAll()是自己启动任务还是必须启动 明确地启动它们。如果是这样,我们是否先开始,然后再开始 Task.WhenAll()

您需要先单独启动每个任务,然后等待它们

我也需要为这些任务做异常处理


每个任务都是独立的执行单元,因此异常处理发生在其范围内。这意味着您可以做的是作为结果从任务返回异常。主线程将读取一个结果并进行适当的操作

如果只调用构造函数,这些
任务
实例将不会运行。由于任务尚未启动,
whalll
将永远不会返回,您将死锁

改用
System.Threading.Task.Run

Task t1 = Task.Run(() => { /* Do Something */ });
Task t2 = Task.Run(() => { /* Do Something */ });
...
删除启动任务的循环

Task.Run方法(Action).NET Framework 4.5

对要在线程池上运行的指定工作进行排队,并返回任务 负责那项工作

在此进一步阅读:

关于异常处理,您可以使用
任务
参数从continuation中访问所有结果,甚至异常:

Task.WhenAll(allTasks).ContinueWith((t) =>
{
    if(t.RanToCompletion)
    {
        MyBlockingCollection.CompleteAdding();
    }
    else
    {
        Console.WriteLine(t.Exception);
    }
});

关于这方面的更多信息:

似乎只要运行代码就可以回答您关于任务何时启动的问题。关于异常处理,虽然我不太确定,但它确实设置了
状态
属性,以防在处理任务时发生异常。如果您不熟悉任务,然后,我强烈建议您阅读关于该主题的一篇(如果不是最好的)文章:。如果我在try-catch中包装了
Task.WhenAll()
,并且如果Task抛出异常,那么这个try-catch块会捕获异常吗?@Tigran,这是错误的。您有多种选择,最好(imo)是在一个连续中创建多个代码路径。另一种方法是创建专门用于处理故障的延续@杰尼什拉巴迪亚:没错。如果是
Wait()
WaitAll()
您将从引发异常、未处理或从内部重试的所有任务中收到
AggregatedException
类型。
Task.WhenAll(allTasks).ContinueWith((t) =>
{
    if(t.RanToCompletion)
    {
        MyBlockingCollection.CompleteAdding();
    }
    else
    {
        Console.WriteLine(t.Exception);
    }
});