VSoft.Awaitable
v0.5.0
Il s'agit d'une bibliothèque simple pour passer des appels de fonction asynchrones. C'est un wrapper sur OmnithReadLibrary et est basé sur sa propre fonctionnalité parallèle.async.
Parallel.async ne fournit pas un moyen simple d'annuler les appels et d'être informé de l'annulation, et il ne permet pas le retour des résultats.
Incluez VSoft.Awaitable dans votre clause UTILISATION.
TAsync.Configure<string>(
function ( const cancelToken : ICancellationToken) : string
var
i: Integer;
begin
result := ' Hello ' + value ;
for i := 0 to 2000 do
begin
Sleep( 1 );
// in loops, check the token
if cancelToken.IsCancelled then
exit;
end ;
// where api's can take a handle for cancellation, use the token.handle
WaitForSingleObject(cancelToken.Handle, 5000 );
// any unhandled exceptions here will result in the on exception proc being called (if configured)
// raise Exception.Create('Error Message');
end , token);
)
.OnException(
procedure ( const e : Exception)
begin
Label1.Caption := e.Message;
end )
.OnCancellation(
procedure
begin
// clean up
Label1.Caption := ' Cancelled ' ;
end )
.Await(
procedure ( const value : string)
begin
// use result
Label1.Caption := value ;
end );
Vous pouvez également retourner IAwaitable<TResult> à partir des fonctions
function LoadAsyncWithToken ( const token : ICancellationToken; const value : string) : IAwaitable<string>;
begin
// configure our async call and return the IAwaitable<string>
result := TAsync.Configure<string>(
function( const cancelToken : ICancellationToken) : string
begin
// .... do some long running thing
result := ' Hello ' + value ;
end , token);
end ;
// for when there is no result to return
function RunIt ( const token : ICancellationToken; const value : string) : IAwaitable;
begin
// configure our async call and return the IAwaitable<string>
result := TAsync.Configure(
procedure( const cancelToken : ICancellationToken)
begin
// .... do some long running thing
end , token);
end ;
procedure UseIt ;
begin
LoadAsyncWithToken( ' param ' , FTokenSource.Token)
.OnException(
procedure ( const e : Exception)
begin
Label1.Caption := e.Message;
end )
.OnCancellation(
procedure
begin
// clean up
Label1.Caption := ' Cancelled ' ;
end )
.Await(
procedure ( const value : string)
begin
// use result
Label1.Caption := value ;
end );
RunIt( ' param ' , FTokenSource.Token)
.OnException(
procedure ( const e : Exception)
begin
Label1.Caption := e.Message;
end )
.OnCancellation(
procedure
begin
// clean up
Label1.Caption := ' Cancelled ' ;
end )
.Await(
procedure
begin
// use result
Label1.Caption := ' Done ' ;
end );
Notez que vous attendez invoque réellement la fonction asynchrone. Il y a aussi une surcharge à Tasync.Configure qui ne prend pas de jeton d'annulation lorsque vous n'avez pas besoin d'annuler.