异步方法并行执行



我正在尝试使用异步方法并行执行一些方法,但这些方法没有并行执行。

这是我的代码。

public class MyServiceAsync
{
    private long a = 10000;
    public async Task GetData()
    {
        Console.WriteLine(System.DateTime.Now.ToLongTimeString());
        var task1 = Method1();
        Console.WriteLine(System.DateTime.Now.ToLongTimeString());
        var task2 = Method2();
        Console.WriteLine(System.DateTime.Now.ToLongTimeString());
        var task3 = Method3();
        Console.WriteLine(System.DateTime.Now.ToLongTimeString());
        await task1;
        await task2;
        await task3;
        Console.WriteLine(System.DateTime.Now.ToLongTimeString());
    }
    public async Task Method1()
    {
        for (long i = 0; i < a * a; i++)
        {
        }
    }
    public async Task Method2()
    {
        for (long i = 0; i < a * a; i++)
        {
        }
    }
    public async Task Method3()
    {
        for (long i = 0; i < a * a; i++)
        {
        }
    }
}

我正在执行这些方法。

MyServiceAsync service1 = new MyServiceAsync();
service1.GetData().Wait();

在方法 1 完成之前,方法 2 不会执行。

谢谢伊姆兰汗

使用 await Task.WhenAll(task1, task2, task3); 让它们并行执行。

目前,您仍在通过单独等待每个任务来串行执行任务。

编辑:

为了演示Panagiotis关于"此代码中没有任务"的含义:

没有任务:

class Program
{
    static void Main(string[] args)
    {
        var mainTask = MainAsync(args);
        mainTask.GetAwaiter().GetResult();
    }
    static async Task MainAsync(string[] args)
    {
        var task1 = Method1();
        var task2 = Method2();
        var task3 = Method3();
        await Task.WhenAll(task1, task2, task3);
        Console.ReadLine();
    }

    public static async Task<long> Method1()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 1 : {i}");
            returnValue += i;
        }
        return await Task.FromResult(returnValue);
    }
    public static async Task<long> Method2()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 2 : {i}");
            returnValue += i;
        }
        return await Task.FromResult(returnValue);
    }
    public static async Task<long> Method3()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 3 : {i}");
            returnValue += i;
        }
        return await Task.FromResult(returnValue);
    }
}

输出:

Method 1 : 0
Method 1 : 1
Method 1 : 2
Method 1 : 3
Method 1 : 4
Method 2 : 0
Method 2 : 1
Method 2 : 2
Method 2 : 3
Method 2 : 4
Method 3 : 0
Method 3 : 1
Method 3 : 2
Method 3 : 3
Method 3 : 4

对于任务(即正确等待真正的异步操作(:

class Program
{
    static void Main(string[] args)
    {
        var mainTask = MainAsync(args);
        mainTask.GetAwaiter().GetResult();
    }
    static async Task MainAsync(string[] args)
    {
        var task1 = Method1();
        var task2 = Method2();
        var task3 = Method3();
        await Task.WhenAll(task1, task2, task3);
        Console.ReadLine();
    }

    public static async Task<long> Method1()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 1 : {i}");
            returnValue += i;
            await Task.Delay(1);
        }
        return await Task.FromResult(returnValue);
    }
    public static async Task<long> Method2()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 2 : {i}");
            returnValue += i;
            await Task.Delay(1);
        }
        return await Task.FromResult(returnValue);
    }
    public static async Task<long> Method3()
    {
        var returnValue = 0l;
        for (long i = 0; i < 5; i++)
        {
            Console.WriteLine($"Method 3 : {i}");
            returnValue += i;
            await Task.Delay(1);
        }
        return await Task.FromResult(returnValue);
    }
}

输出:

    Method 1 : 0
    Method 2 : 0
    Method 1 : 1
    Method 3 : 0
    Method 3 : 1
    Method 1 : 2
    Method 2 : 1
    Method 3 : 2
    Method 1 : 3
    Method 2 : 2
    Method 2 : 3
    Method 1 : 4
    Method 3 : 3
    Method 3 : 4
    Method 2 : 4

最新更新