问题描述:我得到了控制台应用程序,它有3个任务,在服务器(本地)上进行一些计算。当我使用等待Task.WhenAll()或替代Task.WaitAll()时,计算这些任务所需的时间类似于以同步方式运行这些任务。我没有希望,所以我尝试使用while循环来检查任务状态。所以我的代码现在看起来像like>
public void DoTask(PIServer server, AFTimeRange timeRange)
{
var timeRanges = DivideTheTimeRange(timeRange);
Task[] tasksArray = new Task[3];
watch.Start();
Stopwatch watch = new Stopwatch();
tasksArray[0] = (Task.Run(() => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[0])));
tasksArray[1] = (Task.Run(() => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[1])));
tasksArray[2] = (Task.Run(() => CalculationClass.AverageValueOfTagPerDay(server, timeRanges[2])));
while (tasksArray[tasksArray.Count() - 1].Status != TaskStatus.RanToCompletion)
{ }
//while (!Task.WaitAll(tasksArray,-1))
//{}
Task.WaitAll(tasksArray);
//await Task.WhenAll(tasksArray); in case the method got async keyword
watch.Stop();
Console.WriteLine("Final elapsed time is" + watch.Elapsed);
}
public static void AverageValueOfTagPerDay(PIServer server, AFTimeRange timeRange)
{
Console.WriteLine("Thread in AVERAGE()> {0} task> {1}", Thread.CurrentThread.ManagedThreadId,Task.CurrentId);
var listOfAverage = new Dictionary<PIPoint, AFValues>();
PIPagingConfiguration config = new PIPagingConfiguration(PIPageType.TagCount, 1);
PIPointList pointList = new PIPointList();
pointList.Add(PIPoint.FindPIPoint(server, "HugeTestingTag_ADracka"));
AFTimeSpan timeSpan = new AFTimeSpan(days: 1);
Stopwatch s = new Stopwatch();
s.Start();
var listResults = pointList.Summaries(timeRange, timeSpan, OSIsoft.AF.Data.AFSummaryTypes.Average, OSIsoft.AF.Data.AFCalculationBasis.TimeWeighted,
OSIsoft.AF.Data.AFTimestampCalculation.Auto, config);
s.Stop();
Console.WriteLine("Elapsed Time >{0} for task>{1}", s.Elapsed,Task.CurrentId);
foreach (var item in listResults)
{
AFValues values = item[OSIsoft.AF.Data.AFSummaryTypes.Average];
PIPoint point = values.PIPoint;
listOfAverage[point] = values;
}
Program.Show(listOfAverage);
}我用AverageValueOfTagPerDay() method.With来度量计算时间,这段代码我可以达到我的目标(计算速度平均快50% ),但是我不知道为什么。也尝试使用why循环Task.WaitAll()方法,但这也没有帮助。那么为什么在while循环中签入Task.Status会使我的任务比方法Task.WhenAll更快?我不明白。
结果不带 WHILE循环:

结果和 WHILE循环:

更新2
Thread.Sleep(1000)在AverageValueOfTagPerDay中的结果:

如果我评论说,虽然循环运行的时间要快一点: 1.04
发布于 2015-03-26 14:57:37
while (tasksArray[tasksArray.Count() - 1].Status != TaskStatus.RanToCompletion)
{ }它只检查最后一个任务,您必须在整个数组上循环。最后一项任务可能会更快,因为它可能在最小范围内工作。
尝试以下几点:
while (tasksArray.Any(t => t.Status != TaskStatus.RanToCompletion))
{ }https://stackoverflow.com/questions/29276323
复制相似问题