Cod*_*man 3 c# parallel-processing entity-framework 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);
}.AsParallel()
Run Code Online (Sandbox Code Playgroud)
另外 - 如果它们实际上是等价的,那么它们的等价性可以通过使用IEnumerable扩展方法的TPL接口来定义吗?或者,当我更新到.NET V {Whatever}时,我是否只是为了打破我的代码?
对于背景,myEnumerable是一个我尚未枚举的EF表(实体)(使数据库往返).
我想要的行为是同步进行数据库调用,返回List,并行并行处理列表(并行地在List上进行一堆Web服务调用)
如果以下两个片段相同,我很好奇
不,他们不是.您以前的代码将尝试对其进行分区IEnumerable,以便并行执行.你后面的代码将元素投射到你的Select顺序,并接收过滤IEnumerable.只有在AsParallel意志并行之后才能发生.
请注意,LINQ-To-Entities实际上并不适用AsParallel.通常,它会导致代码运行速度慢,然后依次运行.此外,DbContext不是线程安全的.该代码可能会带来更多伤害,然后是好的.
您可以做的是首先查询数据库,一旦数据在内存中,使用AsParallel.
我想要的行为是同步进行数据库调用,返回List,并行并行处理列表(并行地在List上进行一堆Web服务调用)
如果要通过返回的数据进行多个Web服务调用,则可以利用存在的自然异步API来发出此类请求.例如,如果您正在查询HTTP端点,则可以HttpClient同时利用它并将其与其结合使用async-await,并执行查询,而无需任何额外的线程.
| 归档时间: |
|
| 查看次数: |
473 次 |
| 最近记录: |