在MainForm闭包OTL线程不关闭

时间:2014-11-27 12:45:02

标签: multithreading delphi otl

当OTL踏板仍在使用IOmniCancellationToken时关闭MainForm不会终止线程。使用以下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',但Threads不会终止。并且程序挂起。为什么线程没有终止?我做错了什么?

1 个答案:

答案 0 :(得分:2)

您是否在代码中检查了IsSignalled的CancelToken?任务不会被强制自动终止。相反,您必须检查代码中的取消,并在发出信号时退出任务。