我有一个队列,里面有 144 个项目。每个队列元素都是一个请求。我试图通过尝试并行运行代码来提高处理性能。我调用 performaction(request) 方法。它实例化一个对象并将请求传递给它并执行一个操作。我可以并行运行此操作,因为这些请求是独立的,并且请求的操作结果也彼此独立。首先我试过
foreach(var request in queue.Values)
Parallel.Invoke(() =>PerformAction(request);
然后我尝试了相同的 foreach。
var task = new Task(() => PerformAction(request));
task.Start();
在我拥有的 foreach 之外
Task.WaitAll();
当运行程序时,parallel.invoke 需要将近 3 秒才能完成,而 Task 需要将近 0.005 秒才能完成。
我有以下问题:
- 为什么并行调用比任务花费更多时间?似乎并行调用没有像我想要的那样以并行模式运行。
- 当我使用任务时,对于每个请求我都创建一个新任务,如果我有 1000 个请求的请求,我最终会创建 1000 个线程还是 CPU 会根据需要处理创建线程?
- Task.WaitAll() 在程序终止之前它会等待所有任务完成吗?