gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:56:55 24 4
gpt4 key购买 nike

这是我发布的前一个问题的后续 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com