如何汇总多个任务结果 - c#

我在下面的代码片段中创建了2个任务,现在我想将两个任务的结果合并为一个变量:

public class DataPoint
{
    public int Id { get; set; }
    public string Data { get; set; }
}

public class Worker
{
    public void DoProcessing()
    {
        List<DataPoint> dp = new List<DataPoint>();

        Task task1 = Task.Factory.StartNew(() => Process1(dp));
        Task task2 = Task.Factory.StartNew(() => Process2(dp));

        Task.WhenAll(task1, task2);

        //var finalResult = task1 result + Task 2 results
    }

    private List<DataPoint> Process1(List<DataPoint> dp1)
    {
        return dp1;
    }
    private List<DataPoint> Process2(List<DataPoint> dp2)
    {
        return dp2;
    }
}

参考方案

如果要加入这两个列表,则首先需要将您的方法标记为async Task,然后将其标记为await Task.WhenAll,以异步地等待两个任务完成:

public async Task DoProcessingAsync()
{
    var task1 = Task.Run(Process1);
    var task2 = Task.Run(Process2);

    var result = await Task.WhenAll(task1, task2);
    var finalResult = task1.Result.Concat(task2.Result).ToList();
}

private List<DataPoint> Process1()
{
    return new List<DataPoint>();
}

private List<DataPoint> Process2()
{
    return new List<DataPoint>();
}

如果您使用的是.NET 4.5或更高版本,则首选Task.Run而不是Task.Factory.StartNew

此外,List<T>也不是线程安全的,请勿在任务内传递要由ProcessX方法返回的列表。使每个返回新的List<DataPoint>,这样就不会出现线程问题。

将谓词<T>转换为Func <T,bool> - c#

我有一个包含成员Predicate的类,希望在Linq表达式中使用该类:using System.Linq; class MyClass { public bool DoAllHaveSomeProperty() { return m_instrumentList.All(m_filterExpression); } private IEnumerable&…

客户端反序列化为数组序列化字典<string,string>数据 - c#

我有一个字典,该字典使用C#中的JavaScriptSerializer进行了序列化。在客户端,我有:"{"dd049eda-e289-4ca2-8841-4908f94d5b65":"2","ab969ac2-320e-42e1-b759-038eb7f57178":"5�…

根据激活的Maven配置文件更新战争名称 - java

在pom中,我有两个配置文件。测试1测试2现在,我希望根据激活的配置文件更改战争名称。预期结果激活test1配置文件后,战争名称应为prefix-test1.war。激活test1和test2时,战争名称应为prefix-test1-test2.war。如果没有激活任何配置文件,则战争名称应为prefix.war。我的POM文件....<?xml ve…

将对象转换为List <object> - c#

我看过类似的问题,但没有什么合适的。我有一个碰巧包含列表的对象。我想把它变成我可以列举的东西。例如:object listObject; // contains a List<Something> List<object> list; list = listObject as List<object>; // list c…

C#等效于Java List <?扩展类> - c#

我有泛型类的基本结构public class Parent<T> where T : Parent<T> { Action<T> Notify; } public class Child : Parent<Child> { } 我想要一个列表,以便可以将Child对象放在此处List<Parent>…