【问题标题】:run multiple task and await for all tasks completes运行多个任务并等待所有任务完成
【发布时间】:2019-03-25 04:53:09
【问题描述】:

我需要运行多个任务来访问数据库并等待所有任务完成以获取结果并将其分配给我的视图模型,我尝试了很多示例但我从未得到结果,请帮助,这是我的代码

var model = new AggregationViewModel();
var loadDataTasks = new Task[]
{
    Task.Run(async () =>model.Alive =  await _repository.GetCountAsync<filter>(Predicate)),
    Task.Run(async () => model.Delay = await _repository.GetCountAsync<Flight>(predicate.And(x => x.Status == "refused")))
};
try
{
    await Task.WhenAll(loadDataTasks);
    foreach (var item in loadDataTasks)
    {

    }
}
catch (Exception ex)
{
}

【问题讨论】:

  • 我尝试相同的样本,但我的 model.Delay 和 model.Alive 始终为 0,我不知道为什么
  • 你的代码缺少最重要的部分:你怎么称呼它?发布完整的调用链。
  • 这是我的主要电话,我还需要别的吗?
  • 好吧抱歉

标签: c# .net asynchronous async-await


【解决方案1】:

看看这个:

 var task1 = _repository.GetCountAsync<filter>(Predicate);
 var task2 = _repository.GetCountAsync<Flight>(predicate.And(x => x.Status == "refused"));

 await Task.WhenAll(task1, task2); //wait both tasks to finish

 model.Alive = await task1;
 model.Delay = await task2;

PS:上面代码放置的函数,对于上面的场景需要异步。

【讨论】:

  • 有一个错字:WaitAll -> WhenAll
  • 我不能在 WaitAll 之前添加等待,我从来没有结果
【解决方案2】:

试试这个代码:

var model = new AggregationViewModel();

//----------------------------------------
var tasks = new List<Task<int>>();
//Add CountA
tasks.Add(_repository.GetCountAsync<filter>(Predicate));
//Add CountB
tasks.Add(_repository.GetCountAsync<Flight>(predicate.And(x => x.Status == "refused")));

//----------------------------------------
// Create a task with "allTasks" name to wait to complete all tasks
Task allTasks = Task.WhenAll(tasks);
try {
    // Wait to compelete "allTask"
     allTasks.Wait();
}
catch(AggregateException) 
{}

//----------------------------------------
//Working on the results

if (allTasks.Status == TaskStatus.RanToCompletion) {
   model.CountA=allTasks.Result[0]
   model.CountB=allTasks.Result[1]
}
// Display information on faulted tasks.
else {
    foreach (var t in tasks) {
        Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
     }
}

【讨论】:

  • 如果有的话,里面有什么?
  • @user1428798,我在if 块的条件部分使用了allTasksfor 块中的 t 变量也指向您定义的每个任务。你有什么问题吗?
  • 在第一部分的if中没有定义
  • 抱歉,我已将其更正为 allTasks。请立即检查。
猜你喜欢
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多