我想使用异步任务同时执行多个循环(我不想使用Parallel.ForEach
)
我做:
static async void Run()
{
await MultiTasks();
}
static async Task MultiTasks()
{
var Loop1 = Loop1Async();
var Loop2 = Loop2Async();
await Loop1;
await Loop2;
}
static async Task Loop1Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 1 : " + i);
}
}
static async Task Loop2Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 2 : " + i);
}
}
在我的Main方法中调用 Run()
。
但是两个循环不会在同一时间执行。第一圈完成后,第二圈开始
为什么以及如何做到这一点?
答案 0 :(得分:6)
您对await
的初学者用户有一个共同的根本误解。
让我对此非常清楚。 Await不会产生异步。它异步等待异步操作完成。
您正在等待同步操作。你正在调用的方法绝对没有异步; await不会使它们异步。相反,如果它们 异步,那么await
会立即将控制权返回给调用者,以便调用者可以继续工作。异步工作完成后,在将来的某个时刻执行方法的其余部分,并使用await
ed结果。
答案 1 :(得分:1)
static async Task MultiTasks()
{
var Loop1 = Loop1Async();
var Loop2 = Loop2Async();
await Task.WhenAll(Loop1, Loop2);
}
正如其他人所说,您的async
方法目前无法执行。
您需要一些允许线程返回系统的东西,以便它们可以实际并行运行。像这样......
static async Task Loop1Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 1 : " + i);
await Task.Yield();
}
}
static async Task Loop2Async()
{
for (int i = 0; i < 500; i++)
{
Console.WriteLine("Loop 2 : " + i);
await Task.Yield();
}
}
答案 2 :(得分:1)
Loop1Async
和Loop2Async
实际上是同步的。考虑使用WriteLineAsync
方法。
您还可以在Task.WhenAll
中使用MultiTasks
。
答案 3 :(得分:0)
您的Loop1Async
和Loop2Async
方法内部没有等待。对于async
方法,它需要有1个或多个await