我刚刚使用 OTL 在 i7 2600(4 核 8 HT)上进行了测试。一个简单的Parallel.ForEach
循环利用了所有 8 个。有和没有你拥有的 .NumTasks。图书馆没有问题。
begin
Parallel.ForEach(0, 100)
//.NumTasks(16)
.Execute(
procedure(const value: integer)
var
newValue: Single;
I: Integer;
begin
newValue := value;
for I := 1 to 100000000 do
begin
newValue := newValue * I;
newValue := newValue / I;
end;
end);
ShowMessage('Done!');
end;
我的猜测是问题出在您的代码中。线程中的磁盘访问是首先抵消使用线程的好处的好方法。
我对您的代码知之甚少,但您应该考虑在单个线程中读取数据,然后线程化该数据的实际处理。
我看到您还指定了 .NoWait。您是否在为您的 保存返回值Parallel.ForEach
?保存此值是个好主意,否则您的代码将在 OnClick 退出时阻塞。请参阅 gabr 对此问题的回答。
为什么 OmniThreadLibrary 的 ForEach 会阻塞主线程?