在 MainForm 关闭 OTL 线程不关闭

Posted

技术标签:

【中文标题】在 MainForm 关闭 OTL 线程不关闭【英文标题】:On MainForm closure OTL threads do not close 【发布时间】:2014-11-27 12:45:01 【问题描述】:

当 OTL 线程仍在使用 IOmniCancellationToken 时关闭 MainForm 不会终止线程。使用以下任务配置代码

私人的 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】:

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

【讨论】:

以上是关于在 MainForm 关闭 OTL 线程不关闭的主要内容,如果未能解决你的问题,请参考以下文章

OTL TOmniBlockingCollection(COM 多线程)中的 CoInitialize/CoUninitialize 错误处理

如何关闭嵌套在线程内的线程?

java httpclient httpget不关闭,会占用线程吗

如何优雅的关闭线程池?

正确关闭线程池:shutdown 和 shutdownNow 的区别

如何关闭嵌套在线程内的线程?