繁体   English   中英

同时运行多个任务C#

[英]Concurrently running multiple tasks C#

我在IIS中拥有REST Web API服务,该服务接受请求对象的集合。 用户可以输入100多个请求对象。

我想同时运行这100个请求,然后汇总结果并发回。 这涉及到I / O操作(为每个请求调用后端服务)和CPU绑定操作(以计算少量响应元素)

代码段-

using System.Threading.Tasks;
....

var taskArray = new Task<FlightInformation>[multiFlightStatusRequest.FlightRequests.Count];

for (int i = 0; i < multiFlightStatusRequest.FlightRequests.Count; i++)
{
    var z = i;
    taskArray[z] = Tasks.Task.Run(() =>
        PerformLogic(multiFlightStatusRequest.FlightRequests[z],lite, fetchRouteByAnyLeg)
        );
}
Task.WaitAll(taskArray);
for (int i = 0; i < taskArray.Length; i++)
{
    flightInformations.Add(taskArray[i].Result);
}

public Object PerformLogic(Request,...)
{
    //multiple IO operations each depends on the outcome of the previous result
    //Computations after getting the result from all I/O operations
}

如果我单独运行PerformLogic操作(针对1个对象)需要300毫秒,现在我的要求是,当我在单个请求中针对100个对象运行此PerformLogic()时,应该需要2秒钟左右。

PerformLogic()具有以下步骤-1.调用第三方Web服务以获取一些详细信息2.根据详细信息,调用另一个第三方Web服务3.从Web服务中收集结果,进行少量转换

但是使用Task.run()大约需要7秒钟,我想知道处理并发并达到2秒钟所需NFR的最佳方法。 我可以看到在任何时候7-8个线程可以同时工作

不知道我是否可以生成100个线程或任务,我们可以看到一些更好的性能。 请提出一种有效处理此问题的方法。

从这个判断

public Object PerformLogic(Request,...)
{
  //multiple IO operations each depends on the outcome of the previous result
  //Computations after getting the result from all I/O operations
}

我敢打赌, PerformLogic将大部分时间都花在等待IO操作上。 如果是这样,那么async就有希望。 您将不得不重写PerformLogic甚至可能是IO操作-从上到下的所有级别都必须存在async 但是, 如果可以做到,结果应该会快得多。

除此之外-获得更快的硬件。 如果8核耗时7秒,则获得32核。 它很昂贵,但仍可能比重写代码便宜。

首先,不要重新发明轮子。 PLINQ完全可以并行处理事务,无需手动任务处理或结果合并。

如果您要100个任务在2秒内完成300毫秒,那么您至少需要15个并行工作器, 而忽略了并行化本身的成本

var results = multiFlightStatusRequest.FlightRequests
                                      .AsParallel()
                                      .WithDegreeOfParallelism(15) 
                                      .Select(flightRequest => PerformLogic(flightRequest, lite, fetchRouteByAnyLeg)
                                      .ToList();

现在,您已经告诉PLinq使用15个并发工作器来处理您的任务队列。 您确定您的机器可以完成任务吗? 您可以在其中输入任何数字,这并不意味着您的计算机可以神奇地执行此操作。

另一个选择是查看PerformLogic方法并对其进行优化。 您称之为100次,也许值得优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM