【发布时间】:2015-05-25 22:41:39
【问题描述】:
我读过很多帖子,人们都遇到过类似的问题,但他们似乎做出了不适用的假设,或者他们的代码根本不适合我。我需要结合异步的结果方法。 我想要的唯一异步是结果的组合。由于 Azure 服务总线一次只允许我抓取 256 条消息,我想发送多个请求以获取几批一次,并使其成为一个列表。
似乎有一个假设,如果您正在调用异步 工作完成时要返回给调用者的方法 (即:一些长期运行的任务)。但是,我根本不想要那个。我 想等待任务完成然后拿我的组合清单 并返回它。
首先我不想用异步标记我的调用方法。我可以,但我为什么要这样做,我无论如何都要调用一个同步方法,该方法恰好在返回给我之前执行一些异步操作。
我已经看到使用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,但它在得到结果之前就退出了我的方法。
【问题讨论】:
标签: c# azure asynchronous async-await