C# 这两个代码段是否使用IQueryable和.AsParallel等效?

C# 这两个代码段是否使用IQueryable和.AsParallel等效?,c#,entity-framework,parallel-processing,task-parallel-library,C#,Entity Framework,Parallel Processing,Task Parallel Library,我正在编写一些非常基本的TPL代码,我遇到了一种情况,我很好奇以下两个代码片段是否等效: myEnumerable.AsParallel().Select(e => { //do some work that takes awhile return new Thing(e); } myEnumerable.Select(e => { //do some work that takes awhile return new Thing(e); }.AsP

我正在编写一些非常基本的TPL代码,我遇到了一种情况,我很好奇以下两个代码片段是否等效:

myEnumerable.AsParallel().Select(e =>
{
    //do some work that takes awhile
    return new Thing(e);
}

myEnumerable.Select(e =>
{
    //do some work that takes awhile
    return new Thing(e);
}.AsParallel()
另外,如果它们实际上是等价的,那么它们的等价性是否可以根据第三方语言接口和IEnumerable扩展方法的定义而改变?或者我只是在设置自己在更新到.NETV{Whatever}时破坏代码

在后台,
myEnumerable
是一个EF表(实体),我还没有对其进行枚举(进行DB往返)


我所期望的行为是同步进行DB调用,获取一个列表,并并行地对该列表进行操作(并行地对该列表进行一系列web服务调用)

只有在
AsParallel
之后才是并行的。之前的所有内容都只是并行查询的顺序输入流(例外:如果输入已经是并行查询,则将按此处理)

PLINQ无法并行化现有查询,因为它无法对其进行解析。输入是不透明的
IEnumerable

我想要的行为是同步进行DB调用,获取一个列表,并对该列表进行并行操作

使用第一个代码段

并行地在列表上进行一系列web服务调用


TPL在为IO绑定的任务选择最佳并行度方面非常糟糕。使用带有DEGREEOFPARALLELISM的
为特定IO负载选择合适的DOP。

否,它们不是等效的

第一个表达式在使用时将并行运行
Select
中的工作

第二个表达式将在一个线程中运行
Select
中的工作,以生成并行执行的项。您使用第二个表达式所做的工作将并行运行,但这可能是一些琐碎的事情,不会从并行化中受益

我很好奇以下两个片段是否相等

不,他们不是。以前的代码将尝试对
IEnumerable
进行分区,以便并行执行。后面的代码将按顺序将元素投影到
选择中,并接收过滤后的
IEnumerable
。只有
AsParallel
后面的内容将并行运行

请注意,LINQ To实体实际上不适用于
aspallel
。通常,这会导致代码运行速度慢于顺序。而且,
DbContext
不是线程安全的。该代码可能造成的伤害大于好处

您可以做的是首先查询数据库,一旦数据进入内存,就使用
aspallel

我想要的行为是同步进行DB调用,获取 列表返回,并对列表进行并行操作(制作一组web 列表上的服务调用(并行)


如果希望通过返回的数据进行多个web服务调用,则可以利用现有的自然异步API进行此类请求。例如,如果您正在查询HTTP端点,您可以利用
HttpClient
并将其与
async await
结合使用,同时执行查询,而不需要任何额外的线程。

不幸的是,我没有async await可用(hooray遗留系统和古老的编码标准),但我也许能拼凑出这样的东西。我会在几分钟内试一试并更新,谢谢!您使用的是哪个版本的.NET framework?4.0,但我不允许使用async/await,因为经理担心未来的工程师不会理解它是如何工作的。有一件事-您可以添加下面@usr包含的“只有AsParallel之后才是并行的”块吗?这有助于我更好地理解正在发生的事情。是的,这是我一直在使用的东西。不幸的是,咨询有时会对您强制执行一套非常有趣的规则;)我不相信我在使用PLINQ——只是LINQ实体。除非PLINQ在使用TPL时免费提供?@Pheonixblade9 PLINQ代表“并行LINQ”,它是使用TPL(任务并行库)实现的。当您使用
aspallel
时。您正在使用PLINQ。我知道PLINQ是什么:)我只是不知道它在使用TPL时是否自动出现。谢谢要不要解释一下否决票,这样我就可以改进问题了?