ASP.NET MVC C# 中 API 调用的多线程或并行运行

问题描述 投票:0回答:1

我目前正在使用一个 ASP.NET MVC 应用程序,该应用程序与 10 多个供应商的 API 交互以收集数据。我们当前的方法涉及使用

Task.WaitAll
等待所有 API 调用完成,但这会由于 连接超时 导致 用户体验差。我们如何增强 ASP.NET MVC 应用程序的性能以缓解这些超时并改善用户体验?

我尝试通过使用

Task.WhenAny
以及其他异步处理多个 API 调用的方法来优化我的 ASP.NET MVC 应用程序。尽管做出了这些努力,我还是遇到了持续存在的错误。该视图没有显示任何值,并且错误似乎在没有被捕获的情况下被忽略。此外,控制器还将这些错误传递给视图。如何解决这些问题并确保性能更流畅? 所以请让我知道是否有任何方法可以改进代码。 下面的示例代码:

for (int i = 0; i < sources.Count(); i++)
{
    if (sources[i] == "MY" && suppliers.Contains("MY"))
    {
        supplier = new SabreRest.Flights();
    }
    if (sources[i] == "MY" && suppliers.Contains("MY"))
    {
        supplier = new SabreRest.Flights();
    }
    if (sources[i] == "MY" && suppliers.Contains("MY"))
    {
        supplier = new SabreRest.Flights();
    }
    if (sources[i] == "MY" && suppliers.Contains("MY"))
    {
        supplier = new SabreRest.Flights();
    }
    if (sources[i] == "MY" && suppliers.Contains("MY"))
    {
        supplier = new SabreRest.Flights();
    }

    if (supplier != null)
    {
        Task myTask = Task.Factory.StartNew(() =>
        {
            supplier.Search(copyRequest, flightDetails, newpccMatrixList, client, copiednearbyairports);
        });
        taskList.Add(myTask);
        pccMatrixList.ForEach(a => a.IsAvailable = false);
    }
}
Task.WhenAll(taskList);
c# asp.net-mvc multithreading asp.net-web-api
1个回答
0
投票

如果您控制所调用的 API,请使其更快或更可靠。如果你不控制它们,那么你需要考虑如果其中一个或多个失败或超时该怎么办。

如果主要的用户体验问题是请求超时所需的时间太长,则减少超时。相反,如果您可以接受较长的等待时间,但又想防止错误,则可以增加超时时间。然而,在后一种情况下,向用户界面添加某种正在进行的指示器可能是个好主意。

如果您只能接受部分 API 响应,您可能会寻求一些更复杂的同步机制。在极端情况下,

Task.WhenAny
只是等待第一个任务完成,这样所有其他任务就会失败。这就是你想要的吗?

处理此类问题的方式通常是使用复合 UI,其中 UI(而不是服务器)发出 n 并发请求,并在响应到达时异步填充每个 UI 元素。

© www.soinside.com 2019 - 2024. All rights reserved.