'Cannot capture symbol' 用于 Synchronize() 中的本地过程

'Cannot capture symbol' for local procedure in Synchronize()

下面代码中的两个构造都给出错误 E2555 无法捕获符号 WriteToXMLFile

这是为什么?

我在匿名proc中尝试使用AParameter时也有类似的警告,使用本地解决了 'lParameter := AParameter',所以我认为本地 proc 也可以工作....

由于 WriteToXMLFile 包含我不想复制的代码,定义它的正确位置在哪里?

procedure DoStuff(AParameter: Integer);

   procedure WriteToXMLFile;
   begin
      // ...
   end;

begin
  (* 1 *)
  if GetCurrentThreadID= MainThreadID then
    WriteToXMLFile
  else
    TThread.Synchronize(nil,WriteToXMLFile);

  (* 2 *)
  if GetCurrentThreadID= MainThreadID then
    WriteToXMLFile
  else
    TThread.Synchronize(nil,procedure
                begin
                   WriteToXMLFile;
                end);
end;

编译器不支持在匿名方法中使用嵌套过程。

而是将嵌套过程改成匿名方法:

procedure DoStuff(AParameter: Integer);

   function CaptureWriteToXMLFile : TThreadProcedure;
   begin
     Result :=
       procedure
       begin
         // Code here ...
       end;
   end;
var
  WriteToXMLFile : TThreadProcedure;
begin
  WriteToXMLFile := CaptureWriteToXMLFile();

  if GetCurrentThreadID= MainThreadID then
    WriteToXMLFile
  else
    TThread.Synchronize(nil,WriteToXMLFile);
end;

匿名函数returns一个TThreadProcedure。局部变量被分配了一个生成的匿名方法,该方法可以作为参数传递给 Syncronize 过程。