gpt4 book ai didi

c# - 合并异步方法的结果并同步返回

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

我读过很多帖子,其中人们遇到了类似的问题,但他们似乎做出了不适用的假设,或者他们的代码根本不适合我。我需要合并异步结果方法。 我唯一想要的异步就是合并结果。由于 Azure 服务总线仅允许我一次抓取 256 条消息,因此我想发送多个请求来获取几批消息立即将其放入一个列表中。

There seems to be an assumption that if you are calling an async method you want to return to the caller while the work completed (i.e.: some long running task). However, I don't want that at all. I want to wait on the tasks to complete and then take my combined list and return it.

首先,我不想用异步标记我的调用方法。我可以,但为什么我应该这样做,我无论如何都会调用一个同步方法,该方法恰好在返回给我之前执行一些异步操作。

我看过使用 WhenAll() 然后使用结果的示例,但这对我不起作用。我已经尝试了所有不同的排列,但它要么锁定我的应用程序,要么告诉我任务尚未执行。

这是我目前拥有的:

public IEnumerable<BrokeredMessage>[] GetCombinedResults()
{
var job = () => ServiceBus.TrackerClient.ReceiveBatchAsync(BatchLimit);
Task<IEnumerable<BrokeredMessage>> task1 = _retryPolicy.ExecuteAsync<IEnumerable<BrokeredMessage>>(job);
Task<IEnumerable<BrokeredMessage>> task2 = _retryPolicy.ExecuteAsync<IEnumerable<BrokeredMessage>>(job);
IEnumerable<BrokeredMessage>[] results = Task.WhenAll<IEnumerable<BrokeredMessage>>(task1, task2).Result;
return results;
}

但是调用结果会导致它锁定。我读过执行此操作可能会发生死锁,但已将其视为其他问题的答案。 如果我调用 Task.WaitAll() 并且不关心结果,这种类型的设置工作正常。 不知道为什么当我想要从任务返回的结果时这会变得困难。我尝试过使用 Task.Run 但它在获得结果之前就退出了我的方法。

最佳答案

您似乎对使用异步进行扇出并行性感兴趣。这是一件完全正确的事情。无需使整个调用链异步即可利用扇出并行性。

您偶然发现了常见的 ASP.NET 死锁。您可以使用 Task.Run 作为一种简单且安全的方法来避免这种情况。首先,让我们将 GetCombinedResults 设为异步,以保持简单和一致:

public async Task<IEnumerable<BrokeredMessage>[]> GetCombinedResultsAsync()
{
var job = () => ServiceBus.TrackerClient.ReceiveBatchAsync(BatchLimit);
Task<IEnumerable<BrokeredMessage>> task1 = _retryPolicy.ExecuteAsync<IEnumerable<BrokeredMessage>>(job);
Task<IEnumerable<BrokeredMessage>> task2 = _retryPolicy.ExecuteAsync<IEnumerable<BrokeredMessage>>(job);
IEnumerable<BrokeredMessage>[] results = await Task.WhenAll<IEnumerable<BrokeredMessage>>(task1, task2);
return results;
}

这个方法显然是正确的。它不混契约(Contract)步和异步。这样调用它:

var results = Task.Run(() => GetCombinedResultsAsync()).Result;

此方法有效的原因是 GetCombinedResultsAsync 现在在没有同步上下文的情况下执行。

关于c# - 合并异步方法的结果并同步返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30440765/

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