1
|
Dejan Scott Dorman · 技术社区 · 10 年前 |
![]() |
1
1
这是因为 deferred execution . 和 how chained queries in Linq work . 如果您将其更改为最简单的情况
您将看到: 步骤1 步骤2 步骤3 步骤1 步骤2 步骤3 ... ... 现在想象一下,如果你的假设是正确的:
First Select()在上运行
你想的流程是:
然后
等等。
作为一种优化,当Linq检测到您有一个select后跟
尝试运行简化版本:
您将看到步骤1和步骤2按“顺序”进行,但每个迭代都在不同的线程上完成。 但是,AsSequential()将在执行它的主线程上运行。 因此,我希望第1步和第2步 在不同于调用线程的同一线程上运行 但步骤3在启动链的同一线程上运行。 如果要实现所描述的行为,只需将查询更改为:
第一个ToList()求值将在调用线程上运行所有内容,然后AsParallel()在不同的线程上运行每个迭代(取决于ThreadPool的可用性),最后,AsSequential将确保顺序位在调用线程中运行。 |
![]() |
altwood · 任务未完成时[复制] 7 年前 |
![]() |
SharmaPattar · 包含和不包含异步[重复]的任务返回类型 7 年前 |
|
Tobi · 聚合和连接(内部、外部、左侧,…)使用TPL数据流? 7 年前 |
![]() |
nicks · 可以在不同的线程上等待任务完成吗?[副本] 7 年前 |