det*_*ail 15 delphi rest multithreading json delphi-xe7
当使用TJson.JsonToObject在多线程环境中随机访问冲突发生.我在很长一段时间内都在寻找这个问题,我可以用下面的代码来隔离它
JSON类
type
TParameter = class
public
FName : string;
FDataType : string;
FValue : string;
end;
Run Code Online (Sandbox Code Playgroud)
Testfunction:
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;
Run Code Online (Sandbox Code Playgroud)
它只是一个基于更复杂源代码的代码片段.只要我在单个线程中使用此代码,一切都可以正常运行.我想知道代码是否有任何问题.
Ste*_*nke 11
该方法TJSONUnMarshal.ObjectInstance中REST.JsonReflect.pas有一个严重的错误:
它在TRttiType实例上调用FreeAndNil.这应该永远不会做,因为所有TRtti***实例由TRttiContext管理.
删除FreeAndNil后,我再也无法重现访问冲突.
报告为:https://quality.embarcadero.com/browse/RSP-10035
PS我也认为https://quality.embarcadero.com/browse/RSP-9815会影响你的代码.