У меня следующая проблема: у меня узкий цикл (специально), который запускается при событии click в MainWindow.cs моего приложения WPF.
Теперь событие останова, вызванное другой кнопкой, должно остановить замкнутый цикл и завершить задание.
В моем узком цикле у меня есть цикл Parallel.For
. Идея состоит в том, что я должен делать определенное количество вещей одновременно (Parallel.For), и это снова и снова (узкий цикл). Я не знаю, является ли это лучшим подходом, но он единственный, который у меня был, однако он работает :).
У меня проблема с Cancellation.Token, который, похоже, ничего не делает.
Как мне остановить цикл и правильно завершить задание.
Вот мой код:
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
CancellationToken token = cts.Token;
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
Task dlTask = Task.Factory.StartNew(
() =>
{
do
{
Parallel.For(0, num, po, i => {
if (!token.IsCancellationRequested)
{
// do work
}
});
}
while (!token.IsCancellationRequested);
}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default);
dlTask.ContinueWith(prev =>
{
//clean up
}, uiScheduler);
Я попробовал это с po.CancellationToken.IsCancellationRequested
и без, и это не остановилось.
private void btnStop_Click(object sender, RoutedEventArgs e)
{
if (cts.IsCancellationRequested || po.CancellationToken.IsCancellationRequested)
{
cts.Cancel();
}
}
ОБНОВЛЕНИЕ: Решение благодаря Damien_The_Unbeliever :
private void btnStop_Click(object sender, RoutedEventArgs e)
{
cts.Cancel();
}