c# - 如何聚合多个任务结果

标签 c# asynchronous async-await task-parallel-library

我在下面的代码片段中创建了 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>所以你不会有线程问题。

关于c# - 如何聚合多个任务结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39594359/

相关文章:

c# - 如何在字符的第一个实例处截断字符串?

Java Spring - 从异步回调返回?

java - 异步执行任务但先回复

node.js - 在 Node/Express 服务器中使用 async/await 是个坏主意吗?

c# - 无法从 C# 连接到 MySQL

c# - 将进度保存到文本文件 C#

javascript - 嵌套的异步循环推送到不调用主回调的异步队列

node.js - 如果当前运行时支持,则使用顶级等待

javascript - `async/await` 链中的所有函数都必须使用 `async/await` 关键字吗?

c# - .NET 和数据库层