我正在尝试了解 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/