c# - 异步库调用相互依赖又如何处理?

标签 c# asp.net asynchronous async-await task-parallel-library

这是我发布的前一个问题的后续 Calling an async method using a Task.Run seems wrong?

我认为承包商编写的代码是错误的,但根据所提供的答案,我现在想知道这是否是库的错误。该库公开了我需要使用的两种方法。一个返回一个"template",一个使用这个模板的一部分(无论如何它在我的实现中)。但两者都是返回 Tasksasync 方法。

解释我的库有方法:

public Task<TemplateInfo> TemplateInfo(TemplateInfoRequest request);
public Task<List<EmailResult>> SendMessageTemplate(SendMessageTemplateRequest request);

我需要这样调用它们:

public bool SendMessage()
{
  var template = TemplateInfo(...);
  var message = //use template to create message
  var sendResponse = SendMessageTemplate(message);

   return sendResponse.Count > 0;
}

所以第二个调用依赖于第一个。这是异步对我来说没有意义的地方。 我不能也不想同时运行这些。我想按顺序运行它们。 我希望我的 方法同步运行。

answer in my previous question还指出:

Since you're blocking on an async method (which you shouldn't do) there is a chance you'll deadlock.

那么如何访问这些 async 方法,使它们依次处理并返回同步结果但不会导致死锁?

最佳答案

异步并不(必然)意味着并行。

您可以顺序调用这两个异步方法,而无需它们并行运行。只需调用第一个并等待返回的任务,然后对第二个执行相同的操作。

var template = await TemplateInfo(...);
var message = //use template to create message
var sendResponse = await SendMessageTemplate(message);

与同步代码相比,这仍然很有用,因为当异步操作“运行”时,不需要线程,因此您的线程可以继续处理应用程序的其他部分。

如果您同时调用两者,然后等待返回的任务,您将(可能)并行运行:

var templateTask = TemplateInfo(...);
var sendResponseTask = SendMessageTemplate(message);
await templateTask;
await sendResponseTask;

关于c# - 异步库调用相互依赖又如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32609925/

相关文章:

c# - C# 中的查询扩展逻辑

c# - 通过命令行构建和发布 C# .NET Web 应用程序

asp.net - tag-helpers 未正确生成我的网址

java - 在方法上使用 @Async 注释时来自 CglibAopProxy 的 NPE

node.js - 在 Node.js 中,如何异步创建 sha512 哈希?

c# - 为什么我的 MVC 代码不抛出验证错误?

c# - WPF 绑定(bind)与事件处理

asynchronous - Rust中异步/等待的目的是什么?

c# - 如何在 C# 中编写代表性别男性的符号

asp.net - 如何更改用户控件中的默认标签前缀