【发布时间】:2016-11-10 13:28:55
【问题描述】:
我是使用 C# 在 .Net 中进行异步编程的新手。到目前为止,我所了解的是:
通过异步编程,等待 Web 服务或数据库返回数据的线程被释放,以便为新请求提供服务,直到接收到数据。
一旦接收到数据,线程就会重新启动并继续处理调用之后的代码。
现在,我想详细了解线程的状态是如何管理的,以便它可以从进行异步调用的点开始执行。
如果它使用堆栈来处理它,有人可以告诉我这个过程吗?
谢谢,
马扬克
【问题讨论】:
-
Myabe 你可以看看这里:msdn.microsoft.com/en-us/library/mt674882.aspx
-
一切的核心是谦逊的委托:它结合了方法和调用它的对象。从那里我们得到closures,从闭包中我们得到异步/等待使用的状态机。当不使用委托对象时,必须显式传递状态 (
IAsyncResult.AsyncState),但这种情况不太常见。关于这个主题可以写一整本书,我很确定它们确实已经写好了。 -
您的 async/await 代码实际上被转换为一个实现
IAsyncStateMachine的结构,其中包含所有必要的上下文字段,以及一个MoveNext方法,该方法将在每个部分任务完成时被调用。因此,如果您了解在任何其他实例方法上调用BeginInvoke是如何工作的,那么您应该了解状态是如何传递的。 Tl;博士;局部变量没有放在栈上,而是放在一个结构体中(实际上很快就装箱并放在了堆上)。 -
对这个问题的任何回答要么是大量的,要么包含很多'取决于'。
-
异步状态机详解here.
标签: c# .net multithreading asynchronous