【发布时间】:2011-10-05 17:18:42
【问题描述】:
我正在尝试使用 .NET 框架中提供的CancellationToken 机制编写一个支持取消的 LINQ 查询。但是,目前还不清楚将取消和 LINQ 结合起来的正确方法是什么。
使用 PLINQ,可以编写:
var resultSequence = sourceSequence.AsParallel()
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
不幸的是,WithCancellation() 仅适用于 ParallelEnumerable - 因此它不能用于普通的旧 LINQ 查询。当然,可以使用 WithDegreeOfParallelism(1) 将并行查询转换为顺序查询 - 但这显然是一种 hack:
var resultSequence = sourceSequence.AsParallel()
.WithDegreeOfParallelism(1)
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
我还想避免为此操作创建单独的Task,因为我需要在多个地方执行此操作,并且在某些情况下我需要能够控制此代码在哪个线程上运行。
那么,除了编写我自己的 WithCancellation() 实现之外,还有其他方法可以实现同样的目标吗?
【问题讨论】:
-
我知道这个问题是很久以前的问题了,但是使用
AsParallel().WithCancellation(cancellationToken)并让它成为 PLINQ 有什么问题?
标签: c# .net linq parallel-processing cancellation