CancellationToken
используется для отмены сигнала .
loopState.Break()
и loopState.Stop()
используются для завершения выполнения .
Вотпример
Parallel.For(0, maximum_operations, options, (a, loopState) =>
{
// do work
// cancellationToken.Cancel() should be called externally
if(token.IsCancellationRequested)
{
// cancellation requested - perform cleanup work if necessary
// then call
loopState.Break();
// or
loopState.Stop();
}
});
loopState.Break()
означает завершение всех итераций во всех потоках, предшествующих текущей итерации в текущем потоке, и затем выход из цикла ( MSDN ).
loopState.Stop()
означает остановку всех итераций как можно скорее ( MSDN ).
Другим способом прекратить выполнение является вызов токена.необходимо обработать исключение OperationCanceledException
:
public void MyMethod()
{
try
{
Parallel.For(0, maximum_operations, options, (a, loopState) =>
{
// do work
token.ThrowIfCancellationRequested();
});
}
catch (OperationCanceledException)
{
// handle cancellation
}
}
Все эти методы являются допустимыми способами прекращения выполнения Parallel.For
.Какой из них вы используете, зависит от ваших требований.
Например:
- Необходимо ли немедленно остановить все выполнение, когда служба Windows остановлена?Тогда вы можете использовать
token.ThrowIfCancellationRequested()
- Имеет ли ваш цикл дело с объектами IDisposable, которые нуждаются в очистке?Тогда вы можете использовать
loopState.Break()
или loopState.Stop()
Некоторые статьи для справки: