C# 这两个代码段是否使用IQueryable和.AsParallel等效?
我正在编写一些非常基本的TPL代码,我遇到了一种情况,我很好奇以下两个代码片段是否等效: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
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时是否自动出现。谢谢要不要解释一下否决票,这样我就可以改进问题了?