【问题标题】:Load data asynchronously to view in .net core 2.2异步加载数据以在 .net core 2.2 中查看
【发布时间】:2019-11-18 10:32:30
【问题描述】:

我正在使用 wego api 列出航班。但我会在每个请求中获得少量数据,所以我想将所有数据异步加载到视图中。.net 核心中有什么解决方案

对于数据提取,我使用以下代码。所以在查看后我不想停止数据获取。因为我只有 100 条记录,我需要查看剩余的数据,这里没有分页

const int numberOfResultsToGet = 100;
var results = new List<SearchResultMv>();
while (results.Count < numberOfResultsToGet)
{
    var response = await GetFlights(flightParam, auth);
    results.AddRange(response.Results);

    // update offset
    flightParam.Offset += response.Results.Count;

    // sleep for 1 second before sending another request
    Thread.Sleep(TimeSpan.FromSeconds(1));
}

【问题讨论】:

  • 如果你能在minimal reproducible example 上分享你目前的进展,那就太棒了。
  • 读取请求的问题是在整个请求被消耗之前,您无法获得结束标签。这就是为什么很多网站使用 xml 格式的流数据,以便可以读取部分数据。在您的情况下,您似乎收到了完整的请求,所以我不明白异步处理的优势是什么。
  • 我已经编辑了我的查询
  • 当你说你正在视图中加载数据时......你的意思是你正在从你的控制器调用一个api吗?这是和 MVC 应用程序吗?这是 BLAZOR 吗?你到底在说什么?
  • 我正在使用 .net core 2.2 mvc。我想从我的控件异步加载数据以查看除了ajax调用之外有什么办法吗?

标签: c# asp.net-core .net-core asp.net-core-webapi .net-core-2.2


【解决方案1】:
    int Parallelism => 5;
    int NumberOfResultsToGet = 100;
           [HttpGet("get")]
    public async Task<IActionResult> GetFlightsAsync()
    {
        var flights = await 
        GetFlightsByPartitionAsync(GetPages(NumberOfResultsToGet));
        return Ok(flights);
    }

    private async Task<List<SearchResult>> GetFlightsByPartitionAsync(IList<int> 
   pages)
    {
        var result = new List<SearchResult>();

        var output = System.Collections.Concurrent.Partitioner
               .Create(pages)
               .GetPartitions(Parallelism)
               .Select(partition => Task.Run(async () =>
               {
                   using (partition)
                   {
                       while (partition.MoveNext())
                       {
                 // Perform your logic here
                           lock (result)
                               result.Add(new SearchResult() { FlightNo = partition.Current });
                       }
                   }
               }));

        await Task.WhenAll(output);
        return result;
    }
    private IList<int> GetPages(int results)
    {
        IList<int> pages = new List<int>();
        for (int iteration = 1; iteration <= results; iteration++)
            pages.Add(iteration);

        return pages;
    }

【讨论】:

    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多