Delphi 在OTL异步/等待线程中使用局部变量安全吗?

Delphi 在OTL异步/等待线程中使用局部变量安全吗?,delphi,omnithreadlibrary,Delphi,Omnithreadlibrary,我很抱歉问这么简单的问题。这是我第一次在VCL中使用背景线程。所以我想知道在异步部分使用局部变量是否安全 procedure Tfrm1.ThreadedFillDataset; var ds : TOracleDataSet; begin lblThread.Caption := 'Thread start'; Async( procedure begin // executed in background thread //Sleep(3

我很抱歉问这么简单的问题。这是我第一次在VCL中使用背景线程。所以我想知道在异步部分使用局部变量是否安全

procedure Tfrm1.ThreadedFillDataset;
var
  ds : TOracleDataSet;
begin

  lblThread.Caption := 'Thread start';
  Async(
    procedure
    begin
      // executed in background thread
      //Sleep(3000);
      ds := TOracleDataSet.Create(Self);
      //SetVariables 
      ds.Open;
    end)
  .Await(
    procedure
    begin
      ds.First;
      while not ds.Eof do
      begin
        //Fill design time dataset on form
        ds.Next;
      end;
        ds.Free;
        lblThread.Caption := 'Thread finished';

    end);
end;
假设我执行这个方法三次,第一个线程没有完成。这会导致问题吗

你能建议另一种解决这个问题的方法吗?(使用后台线程查询数据库,将结果追加到VCL数据集中。)

谢谢


编辑:我已经检查了问题的答案,我的问题被标记为重复的。我得出的结论是,如果我的方法被调用3次,那么所有3个
ds
局部变量都将指向不同的内存地址,因此每个线程都将访问其TOracleDataSet的本地副本,并且不会出现任何问题。如果有人能证实这一点,我可以结束这个问题,谢谢。

为什么不在后台线程中填充TOracleDataSet?因为等待部分是在主线程中执行的,所以vcl追加的顺序是否重要?如果没有,我看不到任何问题。如果TOracleDataSet对象属于表单,那么如果同时从后台线程和VCL线程访问它,会不会导致问题?TOracleDataSet对象是以表单作为所有者创建的。我想你不需要主人。您可以在wait方法中控制此对象的生存时间。从线程安全的角度来看,多次调用ThreadedFillDataSet方法是可以的。在我看来,不应该这样做。异步/等待匿名过程的执行超出了
ThreadedFillDataset
的范围(我猜)。所以使用局部变量在概念上是错误的。@SotircaMihaitaGeorge我只是四处看看,读了一篇文章,其中提到匿名方法捕获局部变量。这是在编译器级别完成的。因为这里我们使用了一个匿名函数,编译器为我们完成了所有的工作。它“捕获”锁变量并允许匿名函数使用它。为什么不在后台线程中填充TOracleDataSet?因为等待部分是在主线程中执行的,所以vcl追加的顺序是否重要?如果没有,我看不到任何问题。如果TOracleDataSet对象属于表单,那么如果同时从后台线程和VCL线程访问它,会不会导致问题?TOracleDataSet对象是以表单作为所有者创建的。我想你不需要主人。您可以在wait方法中控制此对象的生存时间。从线程安全的角度来看,多次调用ThreadedFillDataSet方法是可以的。在我看来,不应该这样做。异步/等待匿名过程的执行超出了
ThreadedFillDataset
的范围(我猜)。所以使用局部变量在概念上是错误的。@SotircaMihaitaGeorge我只是四处看看,读了一篇文章,其中提到匿名方法捕获局部变量。这是在编译器级别完成的。因为这里我们使用了一个匿名函数,编译器为我们完成了所有的工作。它“捕获”锁变量并允许匿名函数使用它。