Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步库调用相互依赖,如何处理?_C#_Asp.net_Asynchronous_Async Await_Task Parallel Library - Fatal编程技术网

C# 异步库调用相互依赖,如何处理?

C# 异步库调用相互依赖,如何处理?,c#,asp.net,asynchronous,async-await,task-parallel-library,C#,Asp.net,Asynchronous,Async Await,Task Parallel Library,这是我之前发布的问题的后续内容 我认为承包商编写的代码是错误的,但根据提供的答案,我现在想知道是否是库的错误。这个库公开了我需要使用的两种方法。一个返回一个“模板”,另一个使用该模板的一部分(在我的实现中也是如此)。但这两种方法都是返回任务的异步方法 要解释“我的库”有以下几种方法: public Task<TemplateInfo> TemplateInfo(TemplateInfoRequest request); public Task<List<EmailResu

这是我之前发布的问题的后续内容

我认为承包商编写的代码是错误的,但根据提供的答案,我现在想知道是否是库的错误。这个库公开了我需要使用的两种方法。一个返回一个“模板”,另一个使用该模板的一部分(在我的实现中也是如此)。但这两种方法都是返回任务的异步方法

要解释“我的库”有以下几种方法:

public Task<TemplateInfo> TemplateInfo(TemplateInfoRequest request);
public Task<List<EmailResult>> SendMessageTemplate(SendMessageTemplateRequest request);
因此,第二次呼叫依赖于第一次呼叫。这就是异步对我来说没有意义的地方。我不能也不想同时运行这些。我想按顺序运行它们。我希望我的方法同步

一份报告还指出:

因为您使用的是异步方法(,您不应该这样做) 你有可能陷入僵局

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

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;
异步并不(必然)意味着并行

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

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;

Liam你很困惑。异步并不意味着并发。@Aron:异步是并发的一种形式。然而,异步和并行是不同的。异步并不意味着并发。@Aron:异步是并发的一种形式。但是,异步与并行不同。我建议您添加一点非阻塞异步I/O,以清除顺序异步的优点。但是要添加一个
wait
,我必须将我的方法标记为
async
,并返回一个
Task
,我只需要一个同步值。我本来打算只使用
.Result
,但后来我在异步上阻塞了,不是吗?我觉得我不应该这么做。我已经在问题中添加了细节。我想我很困惑,在某个时候我需要停止调用异步方法,并使其同步。或者,我如何让用户知道发生了什么。那么,我如何在不“阻塞”的情况下优雅地摆脱这个问题@Liam最好的选择是一直异步。这需要更改方法调用,直到到达顶部(可以是事件处理程序、
Main
等等)。如果由于某种原因无法做到这一点,那么下一个选项是根本不使用异步,而是一直使用同步代码。如果这不是一个选项(因为您使用的库只有异步API),那么除了在异步代码上阻塞之外,您没有其他选项,然后尝试确保安全地完成。我建议您添加一些关于非阻塞异步I/O的内容,以清除顺序异步的优点。但是要添加
wait
,然后我必须将我的方法标记为
async
,并返回一个
Task
,我只需要一个同步的值。我本来打算只使用
.Result
,但后来我在异步上阻塞了,不是吗?我觉得我不应该这么做。我已经在问题中添加了细节。我想我很困惑,在某个时候我需要停止调用异步方法,并使其同步。或者,我如何让用户知道发生了什么。那么,我如何在不“阻塞”的情况下优雅地摆脱这个问题@Liam最好的选择是一直异步。这需要更改方法调用,直到到达顶部(可以是事件处理程序、
Main
等等)。如果由于某种原因无法做到这一点,那么下一个选项是根本不使用异步,而是一直使用同步代码。如果这不是一个选项(因为您使用的库只有异步API),那么除了在异步代码上阻塞之外,您没有其他选项,然后尝试确保它安全地完成。