@Uwe Hast du etwas Code, damit man den Aufwand ggf. abschätzen kann?
Klar. Man muss dazu nur das Future publizieren:
Delphi-Quellcode:
unit uMyList;
interface
function MyList: TStringList;
function MyListFuture: IFuture<TStringList>;
implementation
uses
System.Threading;
var
InternalFuture: IFuture<TStringList>;
InternalList: TStringList;
function MyList: TStringList;
begin
Result := InternalFuture.Value;
end;
function MyListFuture: IFuture<TStringList>;
begin
Result := InternalFuture;
end;
initialization
InternalList := TStringList.Create;
InternalFuture := TTask.Future<TStringList>(
function: TStringList
begin
Result := InternalList;
for var I := 1
to 10000000
do
Result.Add(I.ToString);
end);
finalization
InternalList.Free;
InternalList :=
nil;
end;
Bei der Verwendung prüft man dann den Status des Future auf
Completed und reagiert entsprechend.
Alternativ würde es hier auch genügen lediglich den
TTaskStatus öffentlich zu machen. Dann muss aber
System.Threading eh schon in der uses-Anweisung stehen. Das Future bietet zudem noch die Möglichkeit des
Cancel.
Angenommen die Bearbeitung erfolgt auf einen Button-Click. Dann würde ich den Button mit einer TAction mit einem entsprechenden Execute-Event verbinden (sollte übrigens eh schon so sein). Im OnUpdate könnte dann sowas stehen:
Delphi-Quellcode:
begin
(Sender as TAction).Enabled := (MyListFuture.Status = TTaskStatus.Completed);
end;
Damit lässt sich der Button nur klicken, wenn die Liste fertig ist,
Dort ließe sich auch eine Behandlung für
Canceled bzw.
Exception unterbringen.