如何在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
相关产品推荐
相关产品推荐

