我有两个彼此不直接相关的异步方法(尽管两者都写了)..我不想阻止任何一个方法的效率。
如果我将一项活动放在这样的一组任务中:
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);
已经键入了此内容,即使任务本身是独立的,如果两个都都不输出,我想如果出现错误也很好。
问题仍然存在;)
答案 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,但是它可以澄清您的意图,因此在编写异步方法调用时更喜欢它。