在c#5.0中,does;异步/等待";函数总是在运行开始时在主线程上运行

在c#5.0中,does;异步/等待";函数总是在运行开始时在主线程上运行,c#,.net,multithreading,asynchronous,async-await,C#,.net,Multithreading,Asynchronous,Async Await,我发现,当我调用“异步”函数时,首先,线程是主线程。当它满足等待任务时,线程将被更改为另一个线程 static void Main(string[] args) { println("Mainthread ID " + Thread.CurrentThread.GetHashCode()); var s = DoSomethingAsync(); println("Waiting for DoSomethingAsync Complete "); Thread.S

我发现,当我调用“异步”函数时,首先,线程是主线程。当它满足等待任务时,线程将被更改为另一个线程

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;
我们可以看到主线程id为1。DoSomethingAsync线程ID也是1。它们是一样的。 因此,在运行“async”函数的开始,是主线程完成了这一部分

这意味着当主线程满足“async”函数时,它将被阻止运行某些东西,直到它满足等待任务为止。“async”函数不会立即使事情异步。是这样吗

我知道如果“async”函数中没有等待任务,那么这个“async”函数将同步运行

这意味着当主线程满足“async”函数时,它将 阻止运行某个内容,直到它满足等待任务为止。“异步” 函数不会使事情立即异步。是这样吗

是的,没错。您的
async
方法将一直运行,直到命中它的第一个
await
关键字,之后将把控制权返回给调用方。在您的示例中,您没有等待该方法,因此它将立即继续执行下一个方法


作为补充说明,控制台应用程序实际上没有主线程,因为它使用默认的
ThreadPoolSynchronizationContext
。这意味着您将在等待的异步方法之后看到任意线程id。

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

任何
wait
操作后的继续操作将利用当前的
SyncrhonizationContext
来确定如何安排它们

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