VSoft.Awaitable
v0.5.0
這是一個簡單的庫,用於進行異步函數調用。它是OmnithReadLibrary上的包裝器,並且基於其自己的Parallel.Async功能。
Parallel.Async不提供取消呼叫的簡單方法,並收到取消通知,並且不允許返回結果。
在您的用途條款中包括vsoft.awaitable。
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 );
您也可以從功能中返回IAwaitable<TResult>
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 );
請注意,等待實際上調用異步函數。 tasync.configure也有一個過載,當您不需要取消時,不需要取消令牌。