Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步编程中的线程状态管理_C#_.net_Multithreading_Asynchronous - Fatal编程技术网

C# 异步编程中的线程状态管理

C# 异步编程中的线程状态管理,c#,.net,multithreading,asynchronous,C#,.net,Multithreading,Asynchronous,我不熟悉使用C#在.Net中进行异步编程。到目前为止,我所了解的是: 使用异步编程,等待web服务或数据库返回数据的线程将被释放,以服务新请求,直到收到数据为止 一旦接收到数据,线程将重新启动并继续处理该调用之后的代码 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 如果它使用一个堆栈来处理这个问题,有人能告诉我这个过程吗 谢谢 马扬克 现在,我想详细了解线程的状态是如何管理的,这样它就可以从异步调用开始执行了 异步方法被分成更小的块。基本上,在编译async方法时,

我不熟悉使用C#在.Net中进行异步编程。到目前为止,我所了解的是:

使用异步编程,等待web服务或数据库返回数据的线程将被释放,以服务新请求,直到收到数据为止

一旦接收到数据,线程将重新启动并继续处理该调用之后的代码

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

如果它使用一个堆栈来处理这个问题,有人能告诉我这个过程吗

谢谢

马扬克

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

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


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

Myabe你可以在这里看一看:一切的核心是谦逊的委托:它结合了方法和它所调用的对象。从那里我们得到,从闭包我们得到async/await使用的状态机。当不使用委托的对象时,状态必须显式地传递(),但这是一种不太常见的情况。关于这个主题可以写一整本书,我很确定它们实际上已经写好了。您的异步/等待代码实际上被转换为一个实现
IAsyncStateMachine
的结构,其中包含所有必要的上下文字段,以及单个
MoveNext
方法,该方法将在每个部分任务完成时调用。因此,如果您了解在任何其他实例方法上调用
BeginInvoke
是如何工作的,那么您应该了解状态是如何传递的。Tl;博士局部变量不是放在堆栈上,而是放在一个结构中(实际上很快就会装箱并放在堆上)。这个问题的任何答案都可能是大量的,或者包含大量的“视情况而定”。异步状态机的详细信息如下。