You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi队列化匿名方法中保留变量值

问题解决方法

你的代码之所以每次都输出Count: 4,是因为匿名方法捕获的是变量i的引用,而非当前循环迭代的具体值。当队列中的匿名方法被主线程执行时,后台线程的循环已经完成,i的值已经变成了4。

要保留每次循环的i值,只需在循环内部创建一个局部变量,将当前i的值赋值给它,让匿名方法捕获这个局部变量即可。因为每次循环迭代都会生成一个独立的局部变量,不会被后续循环修改。

修改后的代码如下:

procedure TForm1.Button1Click(Sender: TObject);
var
  myTask: ITask;
begin
  myTask := TTask.Run(
    procedure
    var
      i: Integer;
    begin
      for i := 0 to 3 do
      begin
        // 每次循环创建独立的局部变量保存当前i的值
        var tempI := i;
        TThread.ForceQueue(
            nil
          , procedure
            begin
              ShowMessage('Count: ' + tempI.ToString);
            end
        );
      end;
    end
  );
end;

如果你的Delphi版本不支持内联变量声明(10.3版本已支持),也可以在循环内显式声明变量:

for i := 0 to 3 do
begin
  tempI: Integer;
  tempI := i;
  TThread.ForceQueue(
      nil
    , procedure
      begin
        ShowMessage('Count: ' + tempI.ToString);
      end
  );
end;

这样修改后,每个队列中的匿名方法都会捕获对应循环迭代的tempI变量,执行时就能输出正确的0、1、2、3。这种方式依然使用ForceQueue,不需要等待日志写入完成,符合你的实际场景需求。

内容的提问来源于stack exchange,提问作者phepher

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:45:32