C# 调用与任务为什么执行时间不同?

C# 调用与任务为什么执行时间不同?,c#,parallel-processing,task-parallel-library,C#,Parallel Processing,Task Parallel Library,我有一个队列,里面有144个项目。每个队列元素都是一个请求。我试图通过并行运行代码来提高处理的性能。我调用performation(request)方法。它实例化一个对象并将请求传递给它并执行一个操作。我可以并行运行此操作,因为这些请求是独立的,请求的操作结果也相互独立。 首先我试过 foreach(var request in queue.Values) Parallel.Invoke(() =>PerformAction(request); 然后我试着用同样的方法 var t

我有一个队列,里面有144个项目。每个队列元素都是一个请求。我试图通过并行运行代码来提高处理的性能。我调用performation(request)方法。它实例化一个对象并将请求传递给它并执行一个操作。我可以并行运行此操作,因为这些请求是独立的,请求的操作结果也相互独立。 首先我试过

foreach(var request in queue.Values)
    Parallel.Invoke(() =>PerformAction(request);
然后我试着用同样的方法

var task = new Task(() => PerformAction(request));
task.Start();
而在我所拥有的一切之外

Task.WaitAll();
当运行程序时,parallel.invoke几乎需要3秒才能完成,而任务几乎需要0.005s才能完成

我有以下问题:

  • 为什么并行调用比任务花费更多的时间?似乎并行调用并没有像我所希望的那样以并行模式运行
  • 当我使用Task时,对于我创建一个新任务的每个请求,如果我有一个1000个请求,我会创建1000个线程吗?或者CPU会根据需要创建线程吗
  • Task.WaitAll()在程序终止之前,它会等待所有任务完成吗

  • 代码中的问题是
    Task.WaitAll()
    无法按预期工作。您已保存并启动了一项任务:

    var task = new Task(() => PerformAction(request));
    task.Start();
    
    但是您没有保留要传递给
    WaitAll
    的每个任务的引用。您需要将所有任务保存在一个数组中,然后将该数组传递给
    WaitAll
    。因此,您的程序执行任务“快速”,因为它不等待完成

    你的问题:

  • 请参见上文,了解为什么
    Parallel.Invoke
    需要更多时间,因为它实际上是运行的。但是,您也没有正确使用它。Invoke接受一系列操作(
    actions[]
    ),并尝试并行运行它们。你每次都用一个动作多次调用它。我甚至不知道你的代码是如何编译的。我相信你想要的是:

    Parallel.ForEach(queue.Values, request => PerformAction(request))
    
  • 您正在为每个请求创建一个新任务,但这不会使用线程将一个任务映射到另一个任务。默认情况下,任务使用

  • Task.WaitAll(tasks)
    会等待所有
    任务完成。但如果你什么都不及格,那就没用了。同样,这不应该像您拥有的那样编译


  • 抱歉,是的,我将任务列表转换为数组的TaskWaitAll。该方法定义为
    Task.WaitAll(params Task[]Tasks)
    (),因此
    Task.WaitAll()
    是(意外地)合法的C代码,它等待一个空的
    Task[]
    数组。(虽然,事实证明,这并不是OP所拥有的代码。)@BradleyGrainger是的,这是我的错误,它运行得非常快。一旦我转换并添加了数组列表,它就正常工作了。