2

我开始使用 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 的任何基本用法吗?

4

1 回答 1

2

该问题源于 OTL 内部的一些(可能有问题的)设计解决方案,目前无法解决(除非通过在主线程中处理消息,正如其他人所说)。

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

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

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

于 2015-04-18T10:18:00.600 回答