На закрытии 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 в своем коде? Задачи не будут принудительно завершаться автоматически. Вместо этого вы должны проверить отмену в вашем коде и выйти из задачи, когда она будет сигнализирована.

Другие вопросы по тегам