Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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_Asynchronous_Async Await - Fatal编程技术网

C# &引用;一直向下异步";:那么,什么';到底是怎么回事?

C# &引用;一直向下异步";:那么,什么';到底是怎么回事?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,我试图完全理解async-await,我理解中的一个空白是看到什么是“一路向下”。我创建了一个async方法,它被另一个async方法调用,等等,一直到我用模糊的术语理解的东西,比如“UI”或“一个可以处理多个请求的web服务器”。我如何用技术术语描述什么是“一路向下” 让我们以web服务器的第二个示例为例 [HttpGet] public async Task<IHttpActionResult> GetRecords() { var records = await rep

我试图完全理解
async
-
await
,我理解中的一个空白是看到什么是“一路向下”。我创建了一个
async
方法,它被另一个
async
方法调用,等等,一直到我用模糊的术语理解的东西,比如“UI”或“一个可以处理多个请求的web服务器”。我如何用技术术语描述什么是“一路向下”

让我们以web服务器的第二个示例为例

[HttpGet]
public async Task<IHttpActionResult> GetRecords()
{
    var records = await repository.GetRecordsFromDbAsync();
    return Ok(records);
}
[HttpGet]
公共异步任务GetRecords()
{
var records=await repository.GetRecordsFromDbAsync();
返回Ok(记录);
}

在.NET源代码中哪里可以找到“一路向下”的代码,使其能够异步调用?

GetRecordsFromDbAsync
是一种异步方法,因此您的顶级异步方法(由支持异步的ASP.NET web服务器调用)只需将其异步性交给下一级即可


一直到
GetRecordsFromDbAsync
或其子代实际调用调用堆栈中的最后一个异步方法为止。在那里,它可能会成为本机的,并且会注册一个I/O中断或在读取文件、处理web请求等时被调用的其他内容。

一直到现在都是Win32 API。A在这个级别上,异步I/O是通过重叠的对象和可报警的等待来完成的,例如,
WaitForMultipleObjectsEx

短语“一路异步”有点误导,因为它通常指的是,一旦使用异步方法,就需要一直使用异步方法(或者返回,取决于您的心理图像)-从异步方法到它的调用方,然后是调用方的调用方,等等,一路返回

您的示例显示了一个WebApi/MVC控制器,该控制器公开了一个
async
任务。
async
链中的下一步是WebApi/MVC基础结构,该基础结构接收HTTP GET请求,将其映射到控制器,并将调用分派到控制器的方法。该基础结构是
async
感知的,这意味着它知道HTTP GET请求所有
async
控制器方法都正确,并等待其结果返回HTTP响应


至于基础设施是如何实现的,我不知道,也不关心——我知道ASP.NET web服务支持
异步任务
控制器,这对我来说已经足够好了。

每种过程编程语言都是一系列函数/过程调用,一个函数/过程调用另一个。这是可能的能够使用调用图来表示从一个过程到另一个过程的调用序列。这些图通常显示从顶部开始到底部的过程调用序列

我很快为ASP.NET MVC应用程序生成了部分调用图的图表。该图表只是ASP.NET MVC应用程序的部分表示,因为它忽略了操作系统(如Windows)、web服务器(如IIS)对请求的初始接收等内容以及ASP.NET的各种组件,它们负责在HTTP请求通过ASP.NET请求处理管道时处理HTTP请求。在本讨论中,可以忽略这些事项。尽管值得注意的是,它们位于调用图的顶部,因为它们处理的是HTTP请求的初始阶段处理HTTP请求,最终ASP.NET会在某个时候调用控制器的操作

如图中所示,我将ASP.NET调用的控制器的操作表示为异步操作。在调用图的左侧是一系列异步过程调用。最终,它到达了问题的主题框

与“一直向下”的概念一致的问题的答案是“我是一个异步方法”"。这个异步方法做什么?好吧,这取决于你想做什么。如果你在读或写一个文件,那么它是一个异步调用来读或写一个文件。你在进行数据库查询吗?然后调用一个异步方法来进行查询。记住这一点,我想你可以说,通常在底部的是一个设备驱动程序方法,该方法异步执行IO访问。尽管它可能是您希望执行的长时间运行的计算绑定异步操作,例如处理图像或视频文件

这里值得注意的是调用图的右侧。虽然通常您可能希望一直调用异步方法,但此调用图的右侧分支显示您根本不需要调用底部的异步方法。

从您的问题中不清楚您是在哪里找到该引用的,或者它是在什么上下文中使用的。但是,“一路异步”通常被理解为意味着您不应该在单个逻辑操作中在同步和异步方法之间来回切换

如果某件事情是异步完成的,那么它应该在所有级别上都是一致异步的,因此“一直向下”(和向上)层次结构/调用堆栈/等等。换句话说,在异步代码中的任何一点执行同步、阻塞调用都没有意义,因为这样它就根本不是真正的异步

从.NET并行编程团队的博客条目中:

一路异步

这里的要点是,在将异步API包装为同步API时,您需要非常小心,如果您不小心,您可能会遇到实际问题。如果您发现自己需要从需要同步调用的对象调用异步方法(例如,您正在实现一个