【问题标题】:Why delegate dictionary pattern with async lambda never returns while calling IAuthenticated.Subscriptions.ListAsync?为什么在调用 IAuthenticated.Subscriptions.ListAsync 时使用异步 lambda 委托字典模式永远不会返回?
【发布时间】:2021-09-19 07:51:30
【问题描述】:

我正在调用存储在字典中的异步 lambda。此异步 lambda 指向使用 Azure 订阅的可等待方法。

public async Task<IEnumerable<ISubscription>> GetAllSubscriptions()
{
   List<ISubscription> subscriptions = new List<ISubscription>();
   //return await azureAuthenticated.Subscriptions.ListAsync();
   foreach (var subscription in await azureAuthenticated.Subscriptions.ListAsync())
   {
       subscriptions.Add(subscription);
   }
        
   return subscriptions;
}

public async Task<IEnumerable<AzureSubscription>> GetAllSubscriptions()
{
    return (await connectionProvider.GetAllSubscriptions()).ToList()
                .Select(s => new AzureSubscription { SubscriptionId = s.SubscriptionId, 
    DisplayName = s.DisplayName, State = s.State });
}

字典是:

private IDictionary<string, Func<Task<List<string>>>> _GetDropDownControlDynamicData;

而字典初始化是:

    _GetDropDownControlDynamicData = new Dictionary<string, Func<Task<List<string>>>>()
    {    
        ["Subscription"] = async () => (await _azureService.GetAllSubscriptions()).Select(pr => pr.DisplayName).ToList(),
        ["OsDiskTypes"] = async () => (await _azureService.GetOsDiskTypes()).Select(pr => pr.DisplayName).ToList()
    }

在这里,当调用者使用以下行调用 lambda 时。

var subscriptions = _GetDropDownControlDynamicData[parameter.Name]().Result.ToList()此调用永远不会返回。我不知道为什么..?

我没有正确使用 lambda 吗?或者我根本不应该编写委托字典模式来发出这些类型的调用。

这里有没有人可以帮忙?提前致谢。

【问题讨论】:

    标签: .net azure async-await delegates


    【解决方案1】:

    当调用者使用 [.Result] 调用 lambda 时,此调用永远不会返回。我不知道为什么..?

    Blocking on asynchronous code can cause a deadlock 如果存在单线程上下文(例如,ASP.NET pre-Core)。

    理想情况下,解决方案是使用await 而不是Result

    var subscriptions = (await _GetDropDownControlDynamicData[parameter.Name]()).ToList();
    

    如果由于某种原因无法做到这一点,那么 some hacks 可能会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 1970-01-01
      相关资源
      最近更新 更多