2011-07-14 8 views
10

.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()という独自の実装を書いていないので、同じことを達成する別の方法がありますか?

+1

私はこの質問が以前からあったことを知っていますが、 'AsParallel()。WithCancellation(cancellationToken)'をちょうどPLINQにすると間違っていましたか? –

答えて

27

この方法はどうですか?

+2

これは実際にConnectの機能リクエストに値するものです。 –

+0

影響があるかどうか、またはAsParallel()で動作するかどうかを理解するには十分ではありませんが、このソリューションのシンプルさが気に入っていますので、私はアップボーディングしています。 –

+8

'return en.TakeWhile(p_item =>!token.IsCancellationRequested);に変更すると、パフォーマンスに何か影響がありますか? – itsho

関連する問題