Как я могу захватывать переменные анонимным методом при использовании его в OTL?

Что я хочу сделать:

У меня есть несколько объектов в списке родов. Я хочу захватить каждый из этих объектов в анонимном методе и выполнить этот метод как отдельную задачу OTL.

Это упрощенный пример:

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;
  LObject: TMyObject;
  MyProc: TProc;
begin
  Objects := TList.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.

И вот результат:

Как видите, захват в основном потоке работает нормально. Тем не менее, я не знаю, был ли захвачен указатель на объект или только его поле идентификатора?

Когда я пытаюсь захватить объект и передать анонимный методCreateTask Функциональные вещи становятся странными.

Прежде всего, только третий экземплярTMyObject казалось захваченным. Во-вторых, яУ меня четыре сообщения в консольном журнале, несмотря на то, что у меня всего три объекта в общем списке. Второе поведение противоречиво, иногда яу меня в консоли три сообщения, иногда яу нас четыре.

Пожалуйста, объясните мне причину двух проблем, упомянутых выше, и предложите решение, которое устраняет проблему и позволяет мне передавать каждый экземпляр объекта в отдельную задачу OTL. (Я не хочу использовать обычныеTThread учебный класс.)

Ответы на вопрос(2)

Ваш ответ на вопрос