OTL 的重复调用次数限制 Parallel.ForEach

Limitation in the number of repeated calls for OTL's Parallel.ForEach

我开始使用 OTL 进行多线程处理,并得到了很大的帮助!

各种使用Parallel.ForEach都成功了。但是现在遇到了一起莫名其妙的案子

请看下面简单完整的代码:

program test;
{$APPTYPE CONSOLE}
uses
  OtlParallel;
var
  i: integer;
begin
  for i := 1 to 1251 do
    Parallel.ForEach(0, 0).Execute(
      procedure (const num: integer)
      begin
      end);
end.

当迭代次数超过1250时,出现错误:

'System Error. Code: 1816. Not enough quota is available to process this command'.

我会不会误解了 OTL 的任何基本用法?

这个问题是由 OTL 内部的一些(可能有问题的)设计解决方案引起的,目前无法解决(除非在主线程中处理消息,正如其他人所说)。

无论如何,我建议您进一步重构您的方法。例如,您可以创建一个只有一个并行工作器的 BackgroundWorker 抽象,然后创建 2000 个工作项并将它们发送到 BackgroundWorker。在后台工作人员的 Execute 方法中,您可以使用 Parallel.ForEach 来处理任务。

或者您可以创建一个具有多个并行任务(= 核心数)的 BackgroundWorker,然后 运行 在每个任务中创建一个普通的 for 循环。这可能会给你最快的性能。

顺便说一句,如果您使用 Parallel.ForEach 的简单形式,那么新的 Parallel.&For 会表现得更好。它没有 ForEach 的所有功能,但速度要快得多。