同时执行多个操作

时间:2016-06-20 22:01:20

标签: c# task multitasking

我想使用异步任务同时执行多个循环(我不想使用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()

但是两个循环不会在同一时间执行。第一圈完成后,第二圈开始

为什么以及如何做到这一点?

4 个答案:

答案 0 :(得分:6)

您对await的初学者用户有一个共同的根本误解。

让我对此非常清楚。 Await不会产生异步。它异步等待异步操作完成

您正在等待同步操作。你正在调用的方法绝对没有异步; await不会使它们异步。相反,如果它们 异步,那么await会立即将控制权返回给调用者,以便调用者可以继续工作。异步工作完成后,在将来的某个时刻执行方法的其余部分,并使用await ed结果。

答案 1 :(得分:1)

尝试.WhenAll(...)

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)

Loop1AsyncLoop2Async实际上是同步的。考虑使用WriteLineAsync方法。

您还可以在Task.WhenAll中使用MultiTasks

答案 3 :(得分:0)

您的Loop1AsyncLoop2Async方法内部没有等待。对于async方法,它需要有1个或多个await