TJson.JsonToObject<T> 在多线程环境下抛出错误
TJson.JsonToObject<T> throws errors in a multi-thread environment
在多线程环境中使用 TJson.JsonToObject
时会发生随机访问冲突。我一直在寻找这个问题,我可以用下面的代码隔离它
JSON class
type
TParameter = class
public
FName : string;
FDataType : string;
FValue : string;
end;
测试函数:
procedure Test();
var
myTasks: array of ITask;
i : integer;
max : integer;
begin
max := 50;
SetLength(myTasks, max);
for i := 0 to max -1 do begin
myTasks[i] := TTask.Create(procedure ()
var
json : string;
p : TParameter;
begin
json := '{"name":"NameOfParam","dataType":"TypeOfParam","value":"ValueOfParam"}';
p := TJson.JsonToObject<TParameter>(json);
p.Free;
end);
myTasks[i].Start;
end;
TTask.WaitForAll(myTasks);
ShowMessage('all done!');
end;
这只是一个基于更复杂来源的代码片段。只要我在单个线程中使用此代码,一切都没有问题。请问代码有没有问题
REST.JsonReflect.pas
中的方法TJSONUnMarshal.ObjectInstance
有一个严重的错误:
它在 TRttiType 实例上调用 FreeAndNil。这应该永远不会完成,因为所有 TRtti*** 实例都由 TRttiContext 管理。
删除 FreeAndNil 调用后,我无法再重现访问冲突。
报告为:https://quality.embarcadero.com/browse/RSP-10035
P.S。我也认为 https://quality.embarcadero.com/browse/RSP-9815 会影响你的代码。
在多线程环境中使用 TJson.JsonToObject
时会发生随机访问冲突。我一直在寻找这个问题,我可以用下面的代码隔离它
JSON class
type
TParameter = class
public
FName : string;
FDataType : string;
FValue : string;
end;
测试函数:
procedure Test();
var
myTasks: array of ITask;
i : integer;
max : integer;
begin
max := 50;
SetLength(myTasks, max);
for i := 0 to max -1 do begin
myTasks[i] := TTask.Create(procedure ()
var
json : string;
p : TParameter;
begin
json := '{"name":"NameOfParam","dataType":"TypeOfParam","value":"ValueOfParam"}';
p := TJson.JsonToObject<TParameter>(json);
p.Free;
end);
myTasks[i].Start;
end;
TTask.WaitForAll(myTasks);
ShowMessage('all done!');
end;
这只是一个基于更复杂来源的代码片段。只要我在单个线程中使用此代码,一切都没有问题。请问代码有没有问题
REST.JsonReflect.pas
中的方法TJSONUnMarshal.ObjectInstance
有一个严重的错误:
它在 TRttiType 实例上调用 FreeAndNil。这应该永远不会完成,因为所有 TRtti*** 实例都由 TRttiContext 管理。
删除 FreeAndNil 调用后,我无法再重现访问冲突。
报告为:https://quality.embarcadero.com/browse/RSP-10035
P.S。我也认为 https://quality.embarcadero.com/browse/RSP-9815 会影响你的代码。