The Task Parallel Library is a joy to work with – it's easy to use and thorough. Recently I was using Parallel.ForEach to process a large collection, but wanted to stop processing early, across all threads, if an individual item met specific criteria. It's as easy as adding a ParallelLoopState parameter to the action body.
var result = Parallel.ForEach(messages, (message, loopState) => { if (message.IsOneThatStopsProcessing) { loopState.Stop(); } // ... // other processing // ... outputStack.Push(message); });
You can halt processing early by calling either Break or Stop on the loop state parameter. Break is for ordered collection where you want to halt at a specific location.