我在下面的代码片段中创建了 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/