C# 并行地从不同来源获取项目并返回结果
我有一些代码看起来与此类似:C# 并行地从不同来源获取项目并返回结果,c#,.net,optimization,task-parallel-library,C#,.net,Optimization,Task Parallel Library,我有一些代码看起来与此类似: public IList<Result> GetResult() { var result = new List<Result>(); result.AddRange(GetSomeItemsA()); result.AddRange(GetSomeItemsB()); result.AddRange(GetSomeItemsC()); ret
public IList<Result> GetResult()
{
var result = new List<Result>();
result.AddRange(GetSomeItemsA());
result.AddRange(GetSomeItemsB());
result.AddRange(GetSomeItemsC());
return result;
}
public IList GetResult()
{
var result=新列表();
AddRange(GetSomeItemsA());
AddRange(GetSomeItemsB());
AddRange(GetSomeItemsC());
返回结果;
}
我想使用任务并行库调用GetSomeItemsA、GetSomeItemsB和GetSomeItemsC方法,或者以其他方式使其更快,然后仅在三个任务完成时返回结果
一般来说,最好的方法是什么?当我们需要从不同的来源获取项目,然后返回包含该来源所有项目的结果时,如何对其进行优化
var result = new List<Result>();
var firstTask = new Task<IEnumerable<Result>>(this.GetSomeItemsA);
var secondTask = new Task<IEnumerable<Result>>(this.GetSomeItemsB);
var thirdTask = new Task<IEnumerable<Result>>(this.GetSomeItemsC);
firstTask.Start();
secondTask.Start();
thirdTask.Start();
Task.WaitAll(firstTask, secondTask, thirdTask);
result.AddRange(firstTask.Result);
result.AddRange(secondTask.Result);
result.AddRange(thirdTask.Result);
return result;
var result=newlist();
var firstTask=新任务(this.GetSomeItemsA);
var secondTask=新任务(this.GetSomeItemsB);
var thirdTask=新任务(this.GetSomeItemsC);
firstTask.Start();
secondTask.Start();
第三个任务。开始();
Task.WaitAll(第一个任务、第二个任务、第三个任务);
result.AddRange(firstTask.result);
result.AddRange(secondTask.result);
result.AddRange(thirdTask.result);
返回结果;
我做了如下操作:
var result = new List<Result>();
var firstTask = new Task<IEnumerable<Result>>(this.GetSomeItemsA);
var secondTask = new Task<IEnumerable<Result>>(this.GetSomeItemsB);
var thirdTask = new Task<IEnumerable<Result>>(this.GetSomeItemsC);
firstTask.Start();
secondTask.Start();
thirdTask.Start();
Task.WaitAll(firstTask, secondTask, thirdTask);
result.AddRange(firstTask.Result);
result.AddRange(secondTask.Result);
result.AddRange(thirdTask.Result);
return result;
var result=newlist();
var firstTask=新任务(this.GetSomeItemsA);
var secondTask=新任务(this.GetSomeItemsB);
var thirdTask=新任务(this.GetSomeItemsC);
firstTask.Start();
secondTask.Start();
第三个任务。开始();
Task.WaitAll(第一个任务、第二个任务、第三个任务);
result.AddRange(firstTask.result);
result.AddRange(secondTask.result);
result.AddRange(thirdTask.result);
返回结果;
您可以使用PLINQ执行以下操作:
public IList<Result> GetResult()
{
return new Func<IEnumerable<Result>>[] { GetSomeItemsA, GetSomeItemsB, GetSomeItemsC }
.AsParallel()
.SelectMany(f => f())
.ToList();
}
public IList GetResult()
{
返回新的Func[]{GetSomeItemsA,GetSomeItemsB,GetSomeItemsC}
.天冬酰胺()
.SelectMany(f=>f())
.ToList();
}
您可以使用PLINQ执行以下操作:
public IList<Result> GetResult()
{
return new Func<IEnumerable<Result>>[] { GetSomeItemsA, GetSomeItemsB, GetSomeItemsC }
.AsParallel()
.SelectMany(f => f())
.ToList();
}
public IList GetResult()
{
返回新的Func[]{GetSomeItemsA,GetSomeItemsB,GetSomeItemsC}
.天冬酰胺()
.SelectMany(f=>f())
.ToList();
}
是否GetSomeItems
返回任务
?什么版本的.NET?嗨,不,它现在不返回任务。NET的4.0版。我正在调用的三个方法我希望被并行调用,这样我就不必等待方法A完成才能调用方法B来获取我的项目。项目是否必须与现在的顺序相同(即先从A开始,然后从B开始,然后从C开始)?不,顺序不重要,当我得到结果时,我可以按照我想要的方式对它们进行排序。GetSomeItems
是否返回一个Task
?什么版本的.NET?嗨,不,它现在不返回任务。NET的4.0版。我正在调用的三个方法我希望被并行调用,这样我就不必等待方法A完成才能调用方法B来获取我的项目。项目是否必须与现在的顺序相同(即先从A开始,然后从B开始,然后从C开始)?不,顺序不重要,当我得到结果时,我可以按照我想要的方式对它们进行排序。你可以调用任务.Factory.StartNew()
,而不是首先创建任务和开始()
,你只需调用任务.Factory.StartNew()
,而不是首先创建任务和开始()
,你可以调用任务.Factory.StartNew()
。