Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同时运行多个任务#_C#_Asp.net_Multithreading_Task_Multitasking - Fatal编程技术网

C# 同时运行多个任务#

C# 同时运行多个任务#,c#,asp.net,multithreading,task,multitasking,C#,Asp.net,Multithreading,Task,Multitasking,我在IIS中有RESTWebAPI服务,它接受一组请求对象。用户可以输入100多个请求对象 我想并发运行这个100请求,然后聚合结果并将其发送回。这涉及I/O操作(为每个请求调用后端服务)和CPU绑定操作(计算少量响应元素) 代码片段- using System.Threading.Tasks; .... var taskArray = new Task<FlightInformation>[multiFlightStatusRequest.FlightRequests.Count

我在IIS中有RESTWebAPI服务,它接受一组请求对象。用户可以输入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
}
使用System.Threading.Tasks;
....
var taskArray=新任务[multiFlightStatusRequest.FlightRequests.Count];
对于(int i=0;i
PerformLogic(MultiLightStatusRequest.FlightRequests[z]、lite、FetchRouteByLeag)
);
}
Task.WaitAll(taskArray);
for(int i=0;i
如果我单独运行PerformLogic操作(针对1个对象)需要300毫秒,现在我的要求是,当我在一个请求中针对100个对象运行PerformLogic()时,应该需要大约2秒

PerformLogic()具有以下步骤-1。请致电第三方web服务以获取详细信息2。根据详细信息,请致电另一个第三方webservice 3。从webservice收集结果,应用少量转换

但是使用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个核。这很昂贵,但仍然比重写代码便宜。

从这一点来看

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完全能够并行地完成任务,不需要手动任务处理或结果合并

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

现在,您已经告诉PLinq使用15个并发工作者来处理您的任务队列。你确定你的机器能完成任务吗?你可以在里面放任何你想要的数字,但这并不意味着你的电脑神奇地获得了这样做的能力


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

首先,不要重新发明轮子。PLINQ完全能够并行地完成任务,不需要手动任务处理或结果合并

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

现在,您已经告诉PLinq使用15个并发工作者来处理您的任务队列。你确定你的机器能完成任务吗?你可以在里面放任何你想要的数字,但这并不意味着你的电脑神奇地获得了这样做的能力


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

向它抛出更多线程并不能解决整个问题;线程越多并不意味着执行速度越快。在最佳情况下,您的CPU可以有效地并行运行尽可能多的线程。如果您的系统有7个或8个内核,那么在您停止看到任何性能优势之前,您大概可以预期有7个或8个并发线程。尝试查看
PerformLogic
操作中的瓶连接,并尝试提高效率。您的I/O操作听起来很昂贵。您还可以看到操作系统级别上允许使用的当前网络连接数量的限制。如果它们少于您拥有的内核数量,您也将失去并行运行这些内核的好处(因为每个任务都必须等待连接可用)。您是否有任何共享状态?计算本身在哪里?如果不知道
PerformLogic
方法的内部内容,很难回答。PerformLogic()有以下步骤-1。打电话给第三方网站服务以获取详细信息2。根据详细信息,请致电另一个第三方webservice 3。从webservice收集结果,应用少量转换向它抛出更多线程并不能解决整个问题;线程越多并不意味着执行速度越快。在最佳情况下,您的CPU可以有效地并行运行尽可能多的线程。如果您的系统有7个或8个内核,那么在您停止看到任何性能优势之前,您大概可以预期有7个或8个并发线程。尝试查看
PerformLogi中的瓶装饮料