首页 > 解决方案 > 有没有办法退出被卡住的 Parallel.foreach 循环中的线程

问题描述

我正在使用 OmniThread Parallel.foreach()。在某些情况下,循环需要很长时间或卡住。

我想知道,是否可以使Parallel.foreach()循环中的每个进程超时?

标签: delphiparallel.foreachomnithreadlibrary

解决方案


简而言之:不,没有。

除非您在“线程主体”代码中对超时处理进行编程(在执行中调用的内容)。

例如,我的数据库引擎允许CancelProcessing从运行查询的不同线程发送对运行查询的调用,这将“干净地”结束正在运行的子线程。

子线程的“”端:

我向 Omnithread 的 github 站点添加了一个FR ,​​以向接口(和类似的)添加一个(Dirty)Terminate方法。IOmniParallel这是一个缺点,因为杀死子线程可能会给你留下内存/资源泄漏。

同时,您可能会使用这种肮脏的关闭解决方案/解决方法,它实际上解决了类似的问题(我在并行处理的例程中遇到了死锁,所以我parallel.Waitfor从未返回 true,更糟糕的是,我的IOmniParallelTask接口变量从未被释放,导致调用线程阻塞为出色地。


推荐阅读