在c# 5.0中,async/await"函数在开始运行时总是在主线程上运行

本文关键字:运行时 开始 函数 运行 线程 quot await async | 更新日期: 2023-09-27 18:17:35

我发现当我调用一个"async"函数时,首先,线程是主线程。当它遇到await Task时,线程将被切换到另一个线程。

static void Main(string[] args)
{
    println("Mainthread ID " + Thread.CurrentThread.GetHashCode());
    var s = DoSomethingAsync();
    println("Waiting for DoSomethingAsync Complete ");
    Thread.Sleep(2000);
    println(s.Result.ToString());
}
static async Task<int> DoSomethingAsync()
{
    println("DoSomethingAsync Thread ID " + Thread.CurrentThread.GetHashCode());
    int val = await Task.Factory.StartNew(() =>
    {
        Thread.Sleep(1000);
        println("Task Thread ID " + Thread.CurrentThread.GetHashCode());
        return 100;
    });
    println("DoSomethingAsync end " + Thread.CurrentThread.GetHashCode());
    return val;

}

结果如下:

11:40:34 383 Mainthread ID 1
11:40:34 398 DoSomethingAsync Thread ID 1
11:40:34 400 Waiting for DoSomethingAsync Complete
11:40:35 400 Task Thread ID 3
11:40:35 400 DoSomethingAsync end 3
11:40:36 401 100

我们可以看到主线程id是1。DoSomethingAsync线程ID也是1。它们是一样的。所以在开始运行"async"函数时,是主线程完成这部分的。

这意味着当主线程遇到"async"函数时,它将被阻塞以运行某些东西,直到它遇到await任务。"async"函数不会使事情立即异步。对吗?

我知道如果"async"函数中没有await Task,这个"async"函数将同步运行

在c# 5.0中,async/await"函数在开始运行时总是在主线程上运行

这意味着当主线程遇到"async"函数时,它将是阻塞以运行某些东西,直到它满足等待任务。"异步"函数不会使事情立即异步。对吗?

是的,是这样的。您的async方法将一直运行,直到击中它的第一个await关键字,这将在此之后将控制权交还给调用者。在您的示例中,您没有对该方法执行await,因此它将立即继续执行下一个方法。

作为旁注,控制台应用程序并没有真正的主线程,因为它使用默认的ThreadPoolSynchronizationContext。这意味着您将在等待的async方法之后看到任意线程id。

该方法将在任何调用该方法的线程中开始运行。如果从主线程调用该方法,它将在主线程中开始运行。如果它是从线程池线程中调用的,它将在线程池线程中开始运行。在这方面,它与任何其他方法没有什么不同。

任何await操作之后的延续都将利用当前的SyncrhonizationContext来确定它们是如何调度的。