2016-11-10 49 views
4

我是使用C#在.Net中进行异步编程的新手。所有到目前为止,我已经明白的是:异步编程中的线程状态管理

随着异步编程,正在等待一个Web服务或数据库返回的数据被释放,直到接收到的数据来服务新的请求的线程。

一旦数据被接收,该线程重新启动并继续处理该呼叫之后到来的代码。现在

,我想详细了解如何状态的线程管理,以便它可以开始从异步调用被做了点执行。

如果它使用一个堆栈来处理这个问题,有人可以给我一个洞察过程吗?

感谢,

Mayank

+2

你可以在这里看看:https://msdn.microsoft.com/en-us/library/mt674882.aspx – Yanga

+3

一切的核心是谦卑的委托:结合了方法和对象的东西它被调用。从那里我们得到[闭包](http://stackoverflow.com/questions/428617/),并从闭包中获取async/await使用的状态机。当不使用委托对象时,必须显式传递状态(['IAsyncResult.AsyncState'](https://msdn.microsoft.com/library/system.iasyncresult.asyncstate)),但这不太常见。整本书都可以写在这个主题上,我很确定他们确实已经写了。 –

+1

您的异步/等待代码实际上被转换为一个实现了'IAsyncStateMachine'的结构,该结构包含所有必要的上下文字段以及一个将在每个部分任务完成时调用的单个'MoveNext'方法。因此,如果您了解如何在任何其他实例方法上调用'BeginInvoke',则应了解状态是如何传递的。文艺青年最爱的;局部变量不放置在堆栈上,而是放置在一个结构中(实际上很快就被装箱并放置在堆上)。 – Groo

回答

0

现在,我想详细了解如何状态的线程管理,以便它可以开始从异步调用被做了点执行。

异步方法被划分成更小的块。基本上,在编译async方法时,对于每个await关键字都会生成新的方法。

请记住,这是一个大大的简化了,这一切都在幕后做,你真的不需要知道它是如何工作才能使用它。