我正在编写一些非常基本的 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()
另外 - 如果它们实际上是等价的,那么它们的等价性是否可以按照 TPL 接口与 IEnumerable 扩展方法的定义进行更改?或者我只是想在更新到 .NET V{Whatever} 时破坏我的代码?
对于背景,myEnumerable
是一个我尚未枚举(进行数据库往返)的 EF 表(实体)。
我期望的行为是同步进行数据库调用,返回列表,并并行操作该列表(并行对列表进行一堆 Web 服务调用)
我很好奇以下两个片段是否等效
不,他们不是。你以前的代码将attempt来划分IEnumerable
为了并行执行它。您后面的代码将把元素投影到您的Select
依次接收过滤后的IEnumerable
。只有在之后发生的事情AsParallel
将并行运行。
请注意,LINQ-To-Entities 并不真正适用于AsParallel
。通常,它会导致您的代码运行速度比顺序慢。还,DbContext
不是线程安全的。该代码可能造成的弊大于利。
您可以做的是首先查询数据库,一旦数据进入内存,使用AsParallel
.
我想要的行为是同步进行数据库调用,得到一个
列表回来,并并行操作列表(制作一堆网络
并行调用列表上的服务)
如果您想通过返回的数据进行多个 Web 服务调用,您可以利用现有的自然异步 API 来发出此类请求。例如,如果您正在查询 HTTP 端点,您可以利用HttpClient
并结合使用它async-await
,并同时执行查询,无需任何额外的线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)