C# 异步编程中的线程状态管理
我不熟悉使用C#在.Net中进行异步编程。到目前为止,我所了解的是: 使用异步编程,等待web服务或数据库返回数据的线程将被释放,以服务新请求,直到收到数据为止 一旦接收到数据,线程将重新启动并继续处理该调用之后的代码 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 如果它使用一个堆栈来处理这个问题,有人能告诉我这个过程吗 谢谢 马扬克 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 异步方法被分成更小的块。基本上,在编译C# 异步编程中的线程状态管理,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我不熟悉使用C#在.Net中进行异步编程。到目前为止,我所了解的是: 使用异步编程,等待web服务或数据库返回数据的线程将被释放,以服务新请求,直到收到数据为止 一旦接收到数据,线程将重新启动并继续处理该调用之后的代码 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 如果它使用一个堆栈来处理这个问题,有人能告诉我这个过程吗 谢谢 马扬克 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 异步方法被分成更小的块。基本上,在编译async方法时,
async
方法时,会为每个wait
关键字生成新方法
请记住,这是一个很大的简化,它都是在幕后完成的,你真的不需要知道它是如何工作的,以使用它 Myabe你可以在这里看一看:一切的核心是谦逊的委托:它结合了方法和它所调用的对象。从那里我们得到,从闭包我们得到async/await使用的状态机。当不使用委托的对象时,状态必须显式地传递(),但这是一种不太常见的情况。关于这个主题可以写一整本书,我很确定它们实际上已经写好了。您的异步/等待代码实际上被转换为一个实现
IAsyncStateMachine
的结构,其中包含所有必要的上下文字段,以及单个MoveNext
方法,该方法将在每个部分任务完成时调用。因此,如果您了解在任何其他实例方法上调用BeginInvoke
是如何工作的,那么您应该了解状态是如何传递的。Tl;博士局部变量不是放在堆栈上,而是放在一个结构中(实际上很快就会装箱并放在堆上)。这个问题的任何答案都可能是大量的,或者包含大量的“视情况而定”。异步状态机的详细信息如下。