У меня есть приложение, которое принимает все добавленные файлы из списка и воспроизводит этот файл.Отменить мою параллельную петлю задачи
это класс, который принимает IEnumerable<string> source
и воспроизводить файлы с помощью другого класса:
public CancellationTokenSource _tokenSource { get; set; }
private IEnumerable<string> _source;
public void play(PacketDevice selectedOutputDevice, double speed, int parallelThreads)
{
var token = _tokenSource.Token;
if (token.IsCancellationRequested)
{
return;
}
Task.Factory.StartNew(() =>
{
try
{
Parallel.ForEach(_source,
new ParallelOptions
{
MaxDegreeOfParallelism = 1;
},
file =>
{
processFile(file, selectedOutputDevice, speed, parallelThreads);
//token.ThrowIfCancellationRequested();
});
}
catch (AggregateException)
{
}
}, _tokenSource.Token).ContinueWith(
t =>
{
OnFinishPlayEvent();
}
, TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread
);
}
И от основной формы при Стоп нажатии кнопки события я изменить _tokenSource.Cancel();
, но моя проблема в том, что мой цикл продолжает работать и не останавливаться.
Можете ли вы продемонстрировать это в короткой, но полной программе? Это действительно выглядит так * должно * работать. Он не отменяет текущие задачи обработки, но он должен избегать запуска каких-либо новых ... Это предполагает, что вы действительно получаете код отмены. Вызов 'Task.WaitAll' зловещий ... вы уверены, что это не просто блокировка? –
На самом деле, вы не передаете какие-либо задачи в 'Task.WaitAll', поэтому я не думаю, что он делает что-либо * - вы должны избавиться от всего блока try/catch, чтобы избежать путаницы. –
Связанный с вами вопрос: http://stackoverflow.com/questions/16900703/stop-my-task-and-all-my-waiting-task, похоже, очень сильно перекрывается с этим. – usr