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计算逻辑结果或则注入结果承载对象在方法中完成赋值