Delphi, VCL, Threads & Async

UserData can hold pointer to user’s object that can contain, for example, a list of TDADataTable or something else that can be useful for you.

back to your previous thread, it can be like

mylist := TList<TDAMemDatatable>.Create;
mylist.AddRange([table1,table2]);
RemoteDataAdapter.BeginFill(mycallback, mylist, [table1, table2]);
procedure TClientForm.mycallback(const aRequest: IROAsyncRequest);
var 
  mylist: TList<TDAMemDatatable>;
begin
  if (not aRequest.Cancelled) then begin
    RemoteDataAdapter.EndFill(aRequest);
    mylist := TList<TDAMemDatatable>(aRequest.UserData); 
    try
      ShowMessage( myList.Count.ToString +  ' tables were loaded');
    finally
       mylist.Free;
    end;
  end
  else 
    ShowMessage('Request was cancelled!');
end;