【问题标题】:Thread State Management in Asynchronous Programming [closed]异步编程中的线程状态管理
【发布时间】: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


【解决方案1】:

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

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

请记住,这是一个很大的简化,所有这些都是在幕后完成的,您真的不需要知道它是如何工作的就可以使用它。

【讨论】:

    猜你喜欢
    • 2022-10-26
    • 1970-01-01
    • 2014-07-04
    • 2013-09-10
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多