多个异步操作在 ASP.NET Core 中不起作用
Posted
技术标签:
【中文标题】多个异步操作在 ASP.NET Core 中不起作用【英文标题】:Multiple Async Operations in not working in ASP.NET Core 【发布时间】:2022-01-16 18:33:15 【问题描述】:我有一个异步方法,我需要在其中获取多个 ViewBag 数据。
问题是当我调试代码时它工作正常,并且不调试它不会加载最后一个视图包。
这里是示例代码
方法一:
public async Task LoadDDL()
var baseCurrencyTask = GetBaseCurrencyAsync();
var remittanceCurrencyTask = GetRemittanceCurrencyAsync();
var branchRemiCountryTask = GetBranchRemCountryAsync();
await Task.WhenAll(baseCurrencyTask, remittanceCurrencyTask, branchRemiCountryTask);
ViewBag.BaseCurrency = baseCurrencyTask.Result.ToSelectList("Id", "Name", BaseCurrencyId);
ViewBag.RemittanceCurrency = remittanceCurrencyTask.Result.ToSelectList("Id", "Name");
ViewBag.BranchRemittanceCountry = branchRemiCountryTask.Result.ToSelectList("Id", "Name");
private async Task<List<Lookup>> GetBaseCurrencyAsync()
return (await _lookupService.GetAllAsync(new LookupRequest() Type = LookupType.BaseCurrency, ParentId = CountryId.ToString() )).ToList();
private async Task<List<Lookup>> GetRemittanceCurrencyAsync()
return (await _lookupService.GetAllAsync(new LookupRequest() Type = LookupType.TransactionCurrency, ParentId = CountryId.ToString() )).ToList();
private async Task<List<Lookup>> GetBranchRemCountryAsync()
return (await _lookupService.GetAllAsync(new LookupRequest() Type = LookupType.Country, ParentId = "" )).ToList();
方法二:
public async Task LoadDDL()
var baseCurrencyTask = GetBaseCurrencyAsync();
var remittanceCurrencyTask = GetRemittanceCurrencyAsync();
var branchRemiCountryTask = GetBranchRemCountryAsync();
await Task.WhenAll(baseCurrencyTask, remittanceCurrencyTask, branchRemiCountryTask);
ViewBag.BaseCurrency = (await baseCurrencyTask).ToSelectList("Id", "Name", BaseCurrencyId);
ViewBag.RemittanceCurrency = (await remittanceCurrencyTask).ToSelectList("Id", "Name");
ViewBag.BranchRemittanceCountry = (await branchRemiCountryTask).ToSelectList("Id", "Name");
对于.ToSelectList扩展方法
public static class ListExtensions
public static List<SelectListItem> ToSelectList<T>(this List<T> list, string idPropertyName, string namePropertyName = "Name", object defaultValue = null)
where T : class, new()
var selectListItems = new List<SelectListItem>();
if (list is null)
return selectListItems;
list.ForEach(item => selectListItems.Add(new SelectListItem
Text = item.GetType().GetProperty(namePropertyName).GetValue(item).ToString(),
Value = item.GetType().GetProperty(idPropertyName).GetValue(item).ToString(),
Selected = defaultValue != null && item.GetType().GetProperty(idPropertyName).GetValue(item).ToString() == defaultValue.ToString()
));
return selectListItems;
有人可以帮忙吗?是我遗漏了什么还是什么?
【问题讨论】:
你为什么在异步方法中使用.Result
?
@Llama 因为他批量等待,结果已经有了
.ToSelectList(
返回什么?
它不加载最后一个视图包 - 你的意思是什么?你怎么知道它没有加载?
@JeroenvanLangen 啊,我的眼睛设法以某种方式掩盖了那条线。我的错。
【参考方案1】:
await
可以多次用于同一个任务。只有第一次才会真正等待它完成。因此,不要调用.Result
,而是尝试获得类似的结果
(await branchRemiCountryTask).ToSelectList(...);
【讨论】:
我也这样做了,但它仍然不起作用..让我也更新问题以上是关于多个异步操作在 ASP.NET Core 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core 脚手架在 VS 2017 中不起作用
为啥 jQuery 验证函数在 ASP.NET MVC Core 应用程序中不起作用?
自定义授权过滤器在 ASP.NET Core 3 中不起作用
Cookie 身份验证在 ASP.NET Core 应用程序中不起作用