多个异步操作在 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 应用程序中不起作用

路由覆盖在 asp.net core 3.1 剃须刀页面中不起作用

使用中间件的全局异常处理在 ASP.Net Core 应用程序中不起作用