c# – 说丢弃任务的非异步方法是否位于async-await链的“顶部”是否正确?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 说丢弃任务的非异步方法是否位于async-await链的“顶部”是否正确?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1495字,纯文字阅读大概需要3分钟。
内容图文
![c# – 说丢弃任务的非异步方法是否位于async-await链的“顶部”是否正确?](/upload/InfoBanner/zyjiaocheng/789/dbdb3271830f41ca961bcd6838293187.jpg)
我理解异步方法本身是如何工作的:编译器将其转换为创建状态机(在堆上)的代码,以便该方法实际上“暂停”到达等待状态并返回任务并且调用堆栈展开.在这个链的“底部”是一个简单地返回任务的方法,通常是在启动“自然异步”过程(如I / O)之后.
那么,什么是“顶部”?我想最顶层的方法只是丢弃任务,所以它可以继续前进.那是对的吗?
也许有人可以描述这个的最简单方法是我们的??执行上下文是Windows Forms应用程序而“top”是消息泵.
解决方法:
通常没有什么是顶部的.您描述的状态机的重点是,当异步操作完成时,它会对状态机的MoveNext方法执行回调(该名称是yield运算符的遗留物,基本上是异步语义的原始前提).这个过程实际上不是基于callstack的,它更类似于对你的某个方法进行回调的事件(在这种情况下,是编译器生成的MoveNext方法).
所以为了回答你的问题,异步方法“完成”.一直到链,每个异步方法“完成”.但是当实际的异步进程进行回调时,事情就会重新开始.链上的每个异步方法都会对后一帧的MoveNext方法进行后续回调,从而允许callstack中的前一帧“恢复”.
请考虑以下代码:
static async void Main()
{
Console.WriteLine(await A());
}
static async Task<int> A()
{
return await B();
}
static async Task<int> B()
{
await Task.Delay(1);
return 1;
}
执行Main时会发生什么?如果这是一个没有异步的普通静态Main方法入口点,这将是一个问题,因为你立即退出该程序.这是使用异步时需要使用它的概念的原因之一all the way up the callstack.使用C#7.1,您实际上可以提供异步入口点.
Main调用A时会发生什么? A立即调用B.但B等待延迟.这是真正的异步,因此整个callstack展开.但是在一毫秒之后,B的状态机将结束,并为A调用继续状态.A的状态机将依次包裹并调用Main的继续状态.最后,Main的状态机拥有A的返回值,向控制台写出1.
内容总结
以上是互联网集市为您收集整理的c# – 说丢弃任务的非异步方法是否位于async-await链的“顶部”是否正确?全部内容,希望文章能够帮你解决c# – 说丢弃任务的非异步方法是否位于async-await链的“顶部”是否正确?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。