首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待任务与同时签入Task.Status

等待任务与同时签入Task.Status
EN

Stack Overflow用户
提问于 2015-03-26 10:36:42
回答 1查看 1K关注 0票数 0

问题描述:我得到了控制台应用程序,它有3个任务,在服务器(本地)上进行一些计算。当我使用等待Task.WhenAll()或替代Task.WaitAll()时,计算这些任务所需的时间类似于以同步方式运行这些任务。我没有希望,所以我尝试使用while循环来检查任务状态。所以我的代码现在看起来像like>

代码语言:javascript
复制
    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

EN

回答 1

Stack Overflow用户

发布于 2015-03-26 14:57:37

代码语言:javascript
复制
while (tasksArray[tasksArray.Count() - 1].Status != TaskStatus.RanToCompletion)
{ }

它只检查最后一个任务,您必须在整个数组上循环。最后一项任务可能会更快,因为它可能在最小范围内工作。

尝试以下几点:

代码语言:javascript
复制
while (tasksArray.Any(t => t.Status != TaskStatus.RanToCompletion))
{ }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29276323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档