如果async/await没有创建新线程,请解释此代码

Yur*_*kyy 7 c# multithreading asynchronous task-parallel-library async-await

我已经阅读了这个主题,该主题声称参考msdn并认为async/await不会创建新线程.请看下面的代码:

static class Program
{
    static void Main(string[] args)
    {
        var task = SlowThreadAsync();
        for(int i = 0; i < 5; i++)
        {
            Console.WriteLine(i * i);
        }
        Console.WriteLine("Slow thread result {0}", task.Result);
        Console.WriteLine("Main finished on thread {0}", Thread.CurrentThread.ManagedThreadId);
        Console.ReadKey();
    }

    static async Task<int> SlowThreadAsync()
    {
        Console.WriteLine("SlowThreadAsync started on thread {0}", Thread.CurrentThread.ManagedThreadId);
        await Task.Delay(2000);
        Console.WriteLine("SlowThreadAsync completed on thread {0}", Thread.CurrentThread.ManagedThreadId);
        return 3443;

    }
}
Run Code Online (Sandbox Code Playgroud)

由于这段代码我得到了不同的ThreadId.为什么同一个线程获得不同的ThreadId?

不同的线程

Yuv*_*kov 16

您正在使用控制台应用程序作为示例.这极大地影响了您的测试结果.控制台应用程序没有自定义SynchronizationContext(如Winforms,WPF和ASP.NET),因此它使用在ThreadPoolTaskScheduler任意线程池线程上安排延续.在UI应用程序中尝试相同的示例,您将看到在同一个线程上调用的延续.