OtlParallel unit defines four overloaded Async methods
As it turned out, two of them are not necessary anymore. Since the introduction of the taskConfig parameter, termination procedure can also be specified by setting taskConfig.OnTerminated.
To make the matter simpler, I’ve removed both Asyncs that accept the onTermination parameter.
Source : Here
Parallel.Async( class procedure Async(task: TProc; taskConfig: IOmniTaskConfig = nil); overload; class procedure Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig = nil); overload; class procedure Async(task: TProc; onTermination: TProc; taskConfig: IOmniTaskConfig = nil); overload; class procedure Async(task: TOmniTaskDelegate; onTermination: TProc; taskConfig: IOmniTaskConfig = nil); overload;
As it turned out, two of them are not necessary anymore. Since the introduction of the taskConfig parameter, termination procedure can also be specified by setting taskConfig.OnTerminated.
To make the matter simpler, I’ve removed both Asyncs that accept the onTermination parameter.
class procedure Async(task: TProc; taskConfig: IOmniTaskConfig = nil); overload; class procedure Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig = nil); overload;The old way of setting termination handler …
Parallel.Async(
    procedure
    begin
      // executed in background thread
      Sleep(500);
      MessageBeep($FFFFFFFF);
    end,
    procedure (const task: IOmniTaskControl)
    begin
      // executed in main thread
      btnAsync.Enabled := true;
    end
    )
    );
… must be replaced with slightly more verboseParallel.Async(
    procedure
    begin
      // executed in background thread
      Sleep(500);
      MessageBeep($FFFFFFFF);
    end,
    Parallel.TaskConfig.OnTerminated(
      procedure (const task: IOmniTaskControl)
      begin
        // executed in main thread
        btnAsync.Enabled := true;
      end
    )
  );
Source : Here
 


