微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在调用 IAuthenticated.Subscriptions.ListAsync 时,使用异步 lambda 的委托字典模式永远不会返回?

如何解决为什么在调用 IAuthenticated.Subscriptions.ListAsync 时,使用异步 lambda 的委托字典模式永远不会返回?

我正在调用存储在字典中的异步 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 吗?或者我根本不应该编写委托字典模式来发出这些类型的调用

有人可以帮忙吗?提前致谢。

解决方法

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

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

理想情况下,解决方案是使用 set.seed(1) df <- data.frame(name = rep(letters,10000),condition = sample(0:1,26*10000,replace = TRUE)) library(tidyverse) df_27phi9 <- function() { df %>% group_by(name) %>% mutate(res = paste0(name,Reduce(paste0,ifelse(condition == 1,"*",""),accumulate = TRUE))) %>% ungroup() } df_akrun <- function() { df %>% group_by(name) %>% mutate(name1 = str_c(name,strrep("*",cumsum(condition)))) %>% ungroup() } df_Anoushiravan <- function() { df %>% group_by(name) %>% mutate(name2 = if_else(condition[1] == 1,paste(name[1],sep = ""),name[1]),name2 = accumulate(condition[-1],.init = tibble(name2 = name2[1]),~ if(.y == 1) { paste(.x,sep = "") } else { .x })) %>% unnest(cols = name2) %>% ungroup(name) } df_deschen <- function() { df %>% group_by(name) %>% mutate(cumsum_condition = cumsum(condition)) %>% ungroup() %>% mutate(name1 = str_c(name,cumsum_condition))) } library(microbenchmark) microbenchmark(df_27phi9 = df_27phi9(),df_akrun = df_akrun(),df_Anoushiravan = df_Anoushiravan(),df_deschen = df_deschen(),times = 10L) # Unit: seconds # expr min lq mean median uq max neval # df_27phi9 3.153200 3.296317 3.627211 3.496424 4.066584 4.615941 10 # df_akrun 3.763212 3.949891 4.136863 4.079212 4.340091 4.663039 10 # df_Anoushiravan 5.974054 6.882175 7.204998 7.059219 7.476390 8.551054 10 # df_deschen 3.638056 3.755617 3.928593 3.857894 4.110398 4.350009 10 而不是 await

Result

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。