我在下面的代码snipet中创建了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;
}
}
答案 0 :(得分:4)
由于await Task.WhenAll
汇总了结果,因此可以进一步简化: -
Task<int> t1 = Task.Factory.StartNew(() => { return 1; });
Task<int> t2 = Task.Factory.StartNew(() => { return 2; });
var result = await Task.WhenAll(t1, t2);
// result
// int[2] { 1, 2 }
答案 1 :(得分:3)
如果要加入这两个列表,首先需要将方法标记为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>
,这样您就不会遇到线程问题。