c# - C# await 关键字是否会导致函数调用阻塞?

标签 c# asynchronous async-await

我正在尝试了解 async 和 await 在 C# 中的工作原理。

考虑以下两个片段:

var appIdTask = GetAppIdAsync();
var clientSecretTask = GetClientSecretAsync();
var appId = await appIdTask;
var clientSecret = await clientSecretTask;
Execute(appId, clientSecret);


var appId = await GetAppIdAsync();
var clientSecret = await GetClientSecretAsync();
Execute(appId, clientSecret);

这两个片段有不同的含义。正确的?

第一个将并行进行 Get 调用,而第二个将进行串行调用?

根据我的理解,第一次调用的 await 关键字会阻止第二次调用的执行。

最佳答案

它不会“阻塞”传统意义上的“在接收到某个信号之前暂停当前状态中的当前线程”(异步的主要目标之一是通过允许更有效地使用池线程来增加吞吐量,通过让他们不是都坐等IO),但是是的:如果方法报告它不完整,执行将被await挂起。 ,并在异步结果可用时恢复(很可能在不同的共享线程上)。

所以是的,从语义上讲,它具有不同时运行两件事的效果(请注意,这仅适用于第一次调用是真正异步的情况)。

请注意,许多 API 没有 期待 多个并发异步操作,并且在第一个示例中将具有未定义的行为。

关于c# - C# await 关键字是否会导致函数调用阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61674580/

相关文章:

c# - 为什么我不能在这个 if 语句中使用我的变量?

c# - app.config 中的自由格式 XML 配置部分正文

Java Netty 设置自动读取

c# - 创建循环直到 true 或超时的等待任务

node.js - 使用 node js 返回所有带有过滤文件的文件

c# - 为什么 for 循环初始化中的条件比循环内部更快?

c# - UI 中等待任务的问题

swift - 如何在 tableview 列表中异步加载视频 url 缩略图

android - 如何在android中使用异步任务在自定义布局中一个接一个地显示项目

javascript - 等待深度函数调用的深度异步等待结果?