如何解决为什么在调用 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()
}
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 举报,一经查实,本站将立刻删除。