На закрытии MainForm OTL потоки не закрываются
Закрытие MainForm, когда шаги OTL все еще работают с IOmniCancellationToken, не завершает потоки. Используя следующий код TaskConfiguration
частное CancelToken: IOmniCancellationToken;
CancelToken := CreateOmniCancellationToken;
FWorker := Parallel.ForEach(0, CalcList.Count-1)
.TaskConfig(Parallel.TaskConfig.OnMessage(Self))
.TaskConfig(Parallel.TaskConfig.CancelWith(CancelToken))
.NumTasks(nMax)
.NoWait
.OnStop(procedure (const task: IOmniTask)
begin
task.Invoke(procedure begin
FWorker := nil;
end);
end);
FWorker
.Execute(
procedure (const value: integer)
begin
CalcUnit.EntrySearch(value);
end);
Form.Close CancelToken.Signal ;
Заставляет Форму закрываться и потоки переходят из 'Parallel.ForEach worker' в 'idle Thread worker', но Потоки не завершаются. и программа зависает. Почему темы не заканчиваются? что я делаю не так?
1 ответ
Решение
Вы проверяете CancelToken для IsSignalled в своем коде? Задачи не будут принудительно завершаться автоматически. Вместо этого вы должны проверить отмену в вашем коде и выйти из задачи, когда она будет сигнализирована.