在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