【问题标题】:Multiple Async Tasks多个异步任务
【发布时间】:2018-11-08 15:37:40
【问题描述】:

我有两个彼此不直接相关的异步方法(尽管它们都写出来了)..我不想阻止另一个的效率..

如果我将其中一个活动放在一组这样的任务中:

var list = new List<Task>();

foreach (var t in things)
{
    list.Add(My.MethodAsync(t)); // method returns Task
}

await Task.WhenAll(t);

我知道它不会阻塞,并且可能并行运行..

如果我使用另一种异步方法:

var list = new List<Task>();

foreach (var t in things)
{
    list.Add(My.MethodAsync(t)); // method returns Task
}

foreach (var t in things)
{
    await My.OtherAsync(t)); // method returns Task
}

await Task.WhenAll(t);

Task.WhenAll() 需要等待第二个 foreach 完成...

因此,这样的事情可能/推荐吗?

var allTasks = new List<Task>();

foreach (var t in things)
{
    allTasks.Add(My.MethodAsync(t)); // method returns Task
    allTasks.Add(My.OtherAsync(t)); // method returns Task
}

await Task.WhenAll(t);

输入后,即使任务本身是独立的,如果两者都没有输出,我想如果引发错误会很好.. 嗯

问题仍然存在;)

【问题讨论】:

  • “Task.WhenAll() 需要等待阻塞 foreach 完成...”,不正确。任务将同时运行
  • 哦,真的吗?我认为 Task.WhenAll(t) 还没有开始,并释放了主线程?它不能由于第二个 foreach 阻止它..
  • 我会看看这个 reguard the exceptions。 stackoverflow.com/questions/25009437/…
  • Parallel.Invoke 并行运行受 CPU 限制的操作。 Task.WhenAllTask.WaitAll 等待所有任务完成。不过,您仍然需要先启动它们。如果 MethodAsyncOtherAsync 返回已启动的任务,您的第二个示例就可以了。
  • @m1nkeh 你会打电话给task.Start()

标签: c# async-await


【解决方案1】:
var allTasks = new List<Task>();

foreach (var t in things)
{
    allTasks.Add(My.MethodAsync(t); // method returns Task
    allTasks.Add(My.OtherAsync(t); // method returns Task
}

await Task.WhenAll(t).ConfigureAwait(false);

这会很好用。正如 cmets 中所指出的,如果您的方法返回一个已经启动的 Task(参见 here),那么所有 Task.WhenAll 将做的就是异步等待任务完成。如果这些任务的运行时间足够长,您可以在前一个完成之前启动一个任务,它们可能会并行运行。请注意,我在您的代码中添加了 ConfigureAwait(false)。从技术上讲,它实际上并没有改变您的代码正在执行的操作,因为 await 默认使用 false 完成,但它确实阐明了您的意图,所以我在编写异步方法调用时更喜欢它。

【讨论】:

  • 太好了,这就是我在这种情况下所做的......非常感谢!
猜你喜欢
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多