.NETCore C# Task任务管理 返回相同结果 问题

C# 多个Task返回相同结果时task会被合并

调用任务

每个任务都是返回Task

var assetCountCurrentMonthTask = GetCurrentMonthCreateAsset(orgUids, normalState, currentTime, currentMonth);

var assetCountLastMonthNormalDeleteTask = GetLastMonthCreateNormalAsset(orgUids, normalState, currentTime, currentMonth, lastMonth);

var assetCountLastMonthCurrentMonthNotNormalTask = GetLastMonthCreateCurrentMonthNotNormalAsset(orgUids, normalStateStr, currentTime, currentMonth, lastMonth);

var assetCountCurrentYearTask = GetCurrentYearCreateAsset(orgUids, normalState, currentTime, currentYear);

var assetCountLastYearNormalTask = GetLastYearCreateNormalAsset(orgUids, normalState, currentTime, currentYear, lastYear);

var assetCountLastYearCreateCurrentNotNormalTask = GetLastYearCreateCurrentYearNotNormalAsset(orgUids, normalStateStr, currentTime, currentYear, lastYear);

等待任务处理

等待任务处理过程中,数据处理时会得到错误数据,finishedTask判断逻辑错误

await AwaitStaticTaskFinish(assetOverView, assetCountTask,
                assetCountCurrentMonthTask, assetCountLastMonthNormalDeleteTask, assetCountLastMonthCurrentMonthNotNormalTask,
                assetCountCurrentYearTask, assetCountLastYearNormalTask, assetCountLastYearCreateCurrentNotNormalTask);
                
private static async Task AwaitStaticTaskFinish(AssetOverView assetOverView, Task<int> assetCountTask, 
            Task<int> assetCountCurrentMonthTask, Task<int> assetCountLastMonthCreateNormalTask, Task<int> assetCountLastMonthCreateCurrentMonthNotNormalTask, 
            Task<int> assetCountCurrentYearTask, Task<int> assetCountLastYearCreateNormalTask, Task<int> assetCountLastYearCreateCurrentYearNotNormalTask)
{
     var statisticTask = new List<Task<int>> {
         assetCountTask,
         assetCountCurrentMonthTask, assetCountLastMonthCreateNormalTask, assetCountLastMonthCreateCurrentMonthNotNormalTask,
         assetCountCurrentYearTask,assetCountLastYearCreateNormalTask,assetCountLastYearCreateCurrentYearNotNormalTask};

     while (statisticTask.Count() > 0)
     {
         Task<int> finishedTask = await Task.WhenAny(statisticTask);
         if (finishedTask == assetCountTask)
         {
             assetOverView.AssetTotle = await finishedTask;
         }
         else if (finishedTask == assetCountCurrentMonthTask)
         {
             assetOverView.MounthIncrease.New = await finishedTask;
         }
         else if (finishedTask == assetCountLastMonthCreateNormalTask)
         {
             assetOverView.MounthIncrease.Before += await finishedTask;
         }
         else if (finishedTask == assetCountLastMonthCreateCurrentMonthNotNormalTask)
         {
             assetOverView.MounthIncrease.Before += await finishedTask;
         }
         else if (finishedTask == assetCountCurrentYearTask)
         {
             assetOverView.YearIncrease.New = await finishedTask;
         }
         else if (finishedTask == assetCountLastYearCreateNormalTask)
         {
             assetOverView.YearIncrease.Before += await finishedTask;
         }
         else if (finishedTask == assetCountLastYearCreateCurrentYearNotNormalTask)
         {
             assetOverView.YearIncrease.Before += await finishedTask;
         }
         statisticTask.Remove(finishedTask);
     }
 }

测试数据

测试一

其中第2、5条被合并,第4、6、7被合并
在这里插入图片描述

测试二

在这里插入图片描述

测试三在这里插入图片描述

结论

在返回结果相同时,不要采取完成任务和目标任务做比较

if (finishedTask == assetCountTask) 
 {
      assetOverView.AssetTotle = await finishedTask;
  }
  // 当assetCountTask和assetCountCurrentMonthTask返回结果相同时
  // 该判断无法覆盖,业务逻辑处理会出错
  else if (finishedTask == assetCountCurrentMonthTask) 
  {
      assetOverView.MounthIncrease.New = await finishedTask;
  }

需要out计算逻辑结果或则注入结果承载对象在方法中完成赋值

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值