异步库调用之间的相互依赖以及如何处理

本文关键字:何处理 处理 依赖 调用 之间 异步 | 更新日期: 2023-09-27 18:13:03

这是我之前发布的使用任务调用异步方法的问题的后续。跑步似乎不对?

我认为承包商写的代码是错误的,但从提供的答案,我现在想知道如果这是图书馆的错误。这个库公开了我需要使用的两个方法。一个返回一个"模板",一个使用这个模板的一部分(无论如何,在我的实现中是这样做的)。但是它们都是返回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;
}

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

我上一个问题的答案也说明:

既然你阻塞了一个异步方法(,你不应该这样做)您可能会死锁。

那么我如何访问这些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;