【问题标题】:Multiple Async Operations in not working in ASP.NET Core多个异步操作在 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 啊,我的眼睛设法以某种方式掩盖了那条线。我的错。

标签: c# asp.net-core


【解决方案1】:

await 可以多次用于同一个任务。只有第一次才会真正等待它完成。因此,不要调用.Result,而是尝试获得类似的结果

(await branchRemiCountryTask).ToSelectList(...);

【讨论】:

  • 我也这样做了,但它仍然不起作用..让我也更新问题
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2023-03-16
  • 2022-01-05
相关资源
最近更新 更多