当遇到等待时,控制权返回给调用者,而等待的任务在后台运行(发出/等待网络请求/响应)。我知道等待任务在等待网络响应时不需要线程,因为它实际上并没有运行任何东西,只是在等待。
我想问 - 假设在等待的函数中,有一些同步代码,例如Console.WriteLine
,那么因为控制权已经返回给调用者,那么谁来执行 console.writeline 呢?
假设按钮点击事件发生await Fn1();
.
示例1:
async Task<string> fn1() {
string result = await NetworkCallAsync('http......');
return result;
}
在上面的例子中遇到await Fn1()
,在进行网络调用时,控制权返回到 UI 线程。我明白这一点。当网络调用完成时,Ui 线程将执行其余的代码。即——获取结果并返回。
示例2:
async Task<string> fn1() {
Console.WriteLine("hello"); //or any other synchronous code like Thread.Sleep(10);
string result = await NetworkCallAsync('http......');
return result;
}
在上面的代码中,当按钮单击遇到await Fn1()
并已将控制权返回给UI线程,那么谁执行Console.WriteLine
(or Thread.Sleep(10)
)如上例所示)?
任务不一定需要任何线程来执行。任务可以代表 IO 操作,即磁盘或网络访问。如果是这样,任务可以使用操作系统中的异步功能来避免在等待时使用任何线程。
如果您自己开始任务,您可以指定任务调度器 https://learn.microsoft.com/en-us/dotnet/api/system.threading.tasks.taskscheduler?view=net-5.0这决定了使用什么线程。通常是操作系统线程或任意线程池线程。
任务也可以同步完成,要么是因为结果已经可用,要么是因为该方法需要实现 API,而使用真正的异步 IO 需要做很多工作。
作为任务的用户,您通常不需要关心任务是如何运行的,只需关心它是否已完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)