什么是使用任务并行库的更好方法

Ela*_*hmi 7 .net c# task-parallel-library parallel.foreach

我刚开始使用TPL,我希望对Web服务进行多次并行调用.从我可以收集的内容中,我看到了两种方法.

要么Parallel.ForEach:

List<ServiceMemberBase> list = new List<ServiceMemberBase>(); //Take list from somewhere.
        Parallel.ForEach(list, member =>
            {
                var result = Proxy.Invoke(member);
                //...
                //Do stuff with the result
                //...
            });
Run Code Online (Sandbox Code Playgroud)

或者Task<T>:

List<ServiceMemberBase> list = new List<ServiceMemberBase>(); //Take list from somewhere.
        ForEach(var member in list)
        {
            Task<MemberResult>.Factory.StartNew(() => proxy.Invoke(member));
        }

        //Wait for all tasks to finish.
        //Process the result objects.
Run Code Online (Sandbox Code Playgroud)

无论语法是否正确,这些都是等同的吗?

他们会产生相同的结果吗?如果没有,为什么?哪个更好?

Mon*_*mas 5

对于您讨论的代码和用例,这两种方法基本相同.

当你必须在几个任务上划分输入范围(这里不适用)时,Parallel.ForEach很有用,或者更容易同步几个独立并行操作的结果的合并(这里可能适用?).

无论如何,您已经正确地注意到在Parallel.ForEach情况下,您不必手动同步等待完成,而如果您手动启动任务,则必须自己管理该同步.在这种情况下,你可能会使用类似的东西Task.WaitAll(...).