json multithreading delphi rest delphi-xe7

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.