TJson.JsonToObject<T> arroja errores en un entorno de subprocesos mĂșltiples
multithreading delphi (1)
El método TJSONUnMarshal.ObjectInstance
en REST.JsonReflect.pas
tiene un error grave:
Llama a FreeAndNil en una instancia de TRttiType. Esto nunca debe hacerse porque todas las instancias de TRtti *** son administradas por TRttiContext.
Después de eliminar la llamada de FreeAndNil, ya no pude reproducir la infracción de acceso.
Reportado como: https://quality.embarcadero.com/browse/RSP-10035
PD: También creo que https://quality.embarcadero.com/browse/RSP-9815 afectará su código.
Cuando se usa TJson.JsonToObject
en un entorno multihilo, se producen infracciones de acceso aleatorio. Estuve buscando el problema durante mucho tiempo y pude aislarlo con el siguiente código
Clase JSON
type
TParameter = class
public
FName : string;
FDataType : string;
FValue : string;
end;
Prueba de funcionamiento:
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;
Es solo un fragmento de código basado en una fuente mucho más compleja. Mientras uso este código en un solo hilo, todo funciona sin problemas. Me pregunto si hay algún problema con el código.