当我在TOmniValue数组中有一个字符串时,按名称或显式索引访问该值会引发访问冲突。有关示例,请参阅以下代码。我做错了什么,或者Delphi或TOmniValue中是否有错误?我发现了一种通过索引访问的解决方法,但名称是什么?
更新:我已将Test转移到控制台应用程序中以便于再现,但现在错误只发生在每一次运行中,而不是每次交互。或者现在可能不是同样的错误?
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
OtlParallel,
OtlCommon;
procedure Test;
const
Count = 1000;
var
i: integer;
BackgroundWorker: IOmniBackgroundWorker;
begin
BackgroundWorker := Parallel.BackgroundWorker.NumTasks(2)
.Execute(
procedure (const workItem: IOmniWorkItem)
const Inx_ = 1;
var Inx: integer;
begin
// Works:
workItem.Result := 'Integer: '+workItem.Data[workItem.Data.AsArray.Count-1].AsString;
// Works (but why?!):
workItem.Result := 'Integer: '+workItem.Data[workItem.Data.AsArray.Count*0+Inx_].AsString;
// Raises AV immediately:
workItem.Result := 'Integer: '+workItem.Data[Inx_].AsString;
// Raises AV immediately:
Inx:=workItem.Data.AsArray.Count-1;
workItem.Result := 'Integer: '+workItem.Data[Inx].AsString;
// Raises AV later when workItem.Result is accessed:
workItem.Result := 'Integer: '+workItem.Data['BB'].AsString;
end
)
.OnRequestDone(
procedure (const Sender: IOmniBackgroundWorker;
const workItem: IOmniWorkItem)
begin
workItem.Result.AsString;
end)
;
for i := 1 to Count do begin
BackgroundWorker.Schedule(BackgroundWorker.CreateWorkItem(
TOmniValue.CreateNamed(
[
'AA',IntToStr(Random(100)),
'BB',IntToStr(Random(100))
]
)
));
end;
BackgroundWorker.WaitFor(INFINITE);
end;
begin
Test;
end.
我正在使用最新的Otl主干(r1333)。我相信我在3.03a中也有同样的错误。