多个异步任务

时间:2018-11-08 15:37:40

标签: c# async-await

我有两个彼此不直接相关的异步方法(尽管两者都写了)..我不想阻止任何一个方法的效率。

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

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);

已经键入了此内容,即使任务本身是独立的,如果两个都都不输出,我想如果出现错误也很好。

问题仍然存在;)

1 个答案:

答案 0 :(得分: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);

这将正常工作。如注释中所指出的,如果您的方法返回一个已经启动的Task(请参阅here),则所有Task.WhenAll所要做的就是异步等待任务完成。如果这些任务的运行时间足够长,您可以在上一个任务完成之前启动它们,则这些任务可以并行运行。请注意,我在您的代码中添加了ConfigureAwait(false)。从技术上讲,实际上await不会更改您的代码,因为#include <iostream> #include <type_traits> #include <array> #include <initializer_list> #include <vector> template<typename WantedType, typename... Args> constexpr bool helper_function() { return (std::is_same_v<WantedType, Args> && ... && true); } template <typename Type, std::size_t dim> struct VecND { VecND() = default; template <typename ...Args, std::enable_if_t<(helper_function<Type, Args...>()) >* = nullptr> explicit VecND(Args&&... args) : m_array{ {std::forward<Args>(args)...} } { } std::array<Type, dim> m_array{}; }; int main() { using Vec2D = VecND<double, 2>; std::vector< Vec2D > my_vec; my_vec.emplace_back(3.4, 21.4); return 0; } 的默认设置为false,但是它可以澄清您的意图,因此在编写异步方法调用时更喜欢它。