.NETフレームワークで提供されているCancellationToken
メカニズムを使用して取り消しをサポートするLINQクエリを作成しようとしています。しかし、取り消しとLINQを組み合わせる適切な方法はどのようなものかはっきりしていません。 PLINQでCancellationTokenでLINQを使用する適切な方法
、それは書くことが可能です:
var resultSequence = sourceSequence.AsParallel()
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
は残念ながら、WithCancellation()
はParallelEnumerable
に適用されます - それは、昔ながらのLINQクエリで使用することはできません。これは、シーケンシャル一つに、並列クエリを有効にするWithDegreeOfParallelism(1)
を使用して、もちろん、可能です - しかし、これは明らかにハックです:
var resultSequence = sourceSequence.AsParallel()
.WithDegreeOfParallelism(1)
.WithCancellation(cancellationToken)
.Select(myExpensiveProjectionFunction)
.ToList();
私が必要と私はまた、この操作にTask
別々の作成を回避したいと思いますいくつかの場所でこれを行うには、このコードが実行されるスレッドを制御する必要があります。
WithCancellation()
という独自の実装を書いていないので、同じことを達成する別の方法がありますか?
私はこの質問が以前からあったことを知っていますが、 'AsParallel()。WithCancellation(cancellationToken)'をちょうどPLINQにすると間違っていましたか? –