即使使用 await 运算符,异步方法调用 运行 也是同步的

Async method call running synchronously even with await operator

我正在尝试从控制台应用程序调用此异步方法。我期待我的方法的“a”部分在等待 ReturnsString() 时异步 运行 但事实并非如此,一切似乎都是同步执行的。我不明白为什么。

抱歉我的英语不好。

dotnet fiddler

output

public class AsyncAwaitExe3
{
    public async Task<string> DoAsync()
    {
        string toReturn = "";
        Console.WriteLine("I'm here A");
        //a
        for (int i = 0; i < 30; i++)
        {
            Console.WriteLine($"inside for {i}");
            Thread.Sleep(1000);
        }
        //b
        Console.WriteLine("I'm here B");
        toReturn = await ReturnsString();

        //c
        Console.WriteLine("I'm here C");
        return toReturn;
    }

    public async Task<string> ReturnsString()
    {
        Console.WriteLine("I'm here D");
        await Task.Delay(2000);
        Console.WriteLine("I'm here E");
        return "sharp sword";
    }
}



    static void Main(string[] args)
    {
        AsyncAwaitExe3 exe3 = new AsyncAwaitExe3();

        Console.WriteLine(exe3.DoAsync());

        Console.ReadKey();
    }

a 部分是同步代码——没有任何关于 returns 任务同时继续 运行 的内容。如果你希望它是异步的,你可以将它分解成一个不同的异步方法。然后使用 Task.WhenAll.

等待两者完成

此外,您必须使用 Task.Delay() 而不是 Thread.Sleep()Task.Delay returns 一个你可以等待的任务; Thread.Sleep 只是同步阻塞线程。

async Task RunSectionA()
{
    Console.WriteLine("I'm here A");
    for (int i = 0; i < 30; i++)
    {
        Console.WriteLine($"inside for {i}");
        await Task.Delay(1000);
    }
}

public async Task<string> DoAsync()
{
    var taskA = RunSectionA();
    var taskB = ReturnsString();

    await Task.WhenAll(taskA, taskB);
    return await taskB;
}