¿Cómo puedo capturar variables por un método anónimo cuando lo uso en OTL?

Lo que quiero hacer:

Tengo algunos objetos en una lista genrica. Quiero capturar cada uno de estos objetos en un método anónimo y ejecutar este método como una tarea OTL separada.

Este es un ejemplo simplificado:

program Project51;

{$APPTYPE CONSOLE}

uses
  SysUtils, Generics.Collections, OtlTaskControl, OtlTask;

type
  TProc = reference to procedure;

type
  TMyObject = class(TObject)
  public
    ID: Integer;
  constructor Create(AID: Integer);
  end;

constructor TMyObject.Create(AID: Integer);
begin
  ID := AID;
end;

var
  Objects: TList<TMyObject>;
  LObject: TMyObject;
  MyProc: TProc;
begin
  Objects := TList<TMyObject>.Create;
  Objects.Add(TMyObject.Create(1));
  Objects.Add(TMyObject.Create(2));
  Objects.Add(TMyObject.Create(3));
  for LObject in Objects do
  begin
    //This seems to work
    MyProc := procedure
    begin
      Writeln(Format('[SameThread] Object ID: %d',[LObject.ID]));
    end;
    MyProc;
    //This doesn't work, sometimes it returns 4 lines in console!?
    CreateTask(
      procedure(const Task: IOmniTask)
      begin
        Writeln(Format('[Thread %d] Object ID: %d',[Task.UniqueID, LObject.ID]));
      end
    ).Unobserved.Run;
  end;
  Sleep(500); //Just wait a bit for tasks to finish
  Readln;
end.

Y este es el resultado:

Como puede ver, la captura parece funcionar bien en el hilo principal. Sin embargo, no sé si se ha capturado un puntero a un objeto o solo su campo de ID.

Cuando intento capturar el objeto y pasar el método anónimo aCreateTask Las cosas de la función se vuelven raras.

En primer lugar, solo la tercera instancia deTMyObject Parecía ser capturado. En segundo lugar, tengo cuatro mensajes en el registro de la consola a pesar de que solo tengo tres objetos en la lista genérica. El segundo comportamiento es inconsistente, a veces tengo tres mensajes en la consola, a veces tengo cuatro.

Explíqueme la razón de los dos problemas mencionados anteriormente y proponga una solución que elimine el problema y me permita pasar cada instancia de objeto a una tarea OTL separada. (No quiero usar regularTThread clase.)

Respuestas a la pregunta(2)

Su respuesta a la pregunta