Delphi中 TTask的用法

技术分享 2025-02-02 25 次浏览 次点赞

TTask 类是 System.Threading.TTask 命名空间下的一个类,用于实现异步编程。TTask 提供了一种简单而强大的方式来执行并发任务,而不需要深入处理线程的低级细节。

一、简介
TTask 类允许你以异步方式执行代码,并且提供了一些高级功能,如任务的等待、取消和结果返回。它基于 System.Threading 命名空间,是 Delphi 异步编程框架的重要组成部分。

二、基本用法

  1. 创建和运行一个简单任务
    你可以使用 TTask.Run 方法来启动一个异步任务。这个方法接受一个匿名方法作为参数,并在后台线程中执行它。
    uses
    System.SysUtils, System.Threading;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    TTask.Run(
    procedure
    begin
    // 这里放置你的异步代码
    Sleep(2000); // 模拟耗时操作
    ShowMessage('任务完成!');
    end
    );
    end;

在上面的例子中,ShowMessage 会在任务完成后显示一个消息框。由于 TTask.Run 在后台线程中执行任务,所以主线程不会被阻塞。

  1. 等待任务完成
    有时候你可能需要等待一个任务完成后再继续执行后续代码。你可以使用 TTask 的 Wait 方法来实现这一点。

    procedure TForm1.Button2Click(Sender: TObject);
    var
    Task: ITask;
    begin
    Task := TTask.Run(
    procedure
    begin
    Sleep(2000); // 模拟耗时操作
    end
    );
    // 等待任务完成
    Task.Wait;
    ShowMessage('所有任务已完成!');
    end;

在这个例子中,ShowMessage 会在任务完成后才会被调用。

  1. 返回结果的任务
    TTask 还可以用来返回结果。你可以使用 TTask 类来实现这一点。

    uses
    System.SysUtils, System.Threading;
    function ComputeSumAsync(a, b: Integer): ITask;
    begin
    Result := TTask.Run(
    function: Integer
    begin
    // 模拟一些计算
    Sleep(1000);
    Result := a + b;
    end
    );
    end;
    procedure TForm1.Button3Click(Sender: TObject);
    var
    SumTask: ITask;
    Sum: Integer;
    begin
    SumTask := ComputeSumAsync(3, 4);
    // 等待任务完成并获取结果
    Sum := SumTask.Result;
    ShowMessage(Format('结果是: %d', [Sum]));
    end;

在这个例子中,ComputeSumAsync 函数返回一个 ITask 对象,该对象在后台线程中计算两个数的和,并在任务完成后返回结果。

三、高级用法

  1. 取消任务
    你可以使用 TCancellationToken 来取消任务。TTask 类支持传递一个取消令牌,允许你在任务执行过程中检查是否请求了取消。

    uses
    System.SysUtils, System.Threading;
    procedure TForm1.Button4Click(Sender: TObject);
    var
    CancellationTokenSource: TCancellationTokenSource;
    Task: ITask;
    begin
    CancellationTokenSource := TCancellationTokenSource.Create;
    Task := TTask.Run(
    procedure(CancelToken: TCancellationToken)
    var
    i: Integer;
    begin
    for i := 0 to 10 do
    begin
    if CancelToken.IsCancellationRequested then
    begin
    ShowMessage('任务已被取消!');
    Exit;
    end;
    Sleep(500); // 模拟耗时操作
    end;
    ShowMessage('任务完成!');
    end,
    CancellationTokenSource.Token
    );
    // 等待一段时间后取消任务
    Sleep(3000);
    CancellationTokenSource.Cancel;
    // 等待任务完成(如果它没有被取消)
    Task.Wait;
    end;

在这个例子中,任务会在检查到取消请求后被取消。

  1. 组合任务
    TTask 类还支持组合多个任务,使用 WhenAll 和 WhenAny 方法来等待一组任务全部完成或任何一个任务完成。

    procedure TForm1.Button5Click(Sender: TObject);
    var
    Tasks: array of ITask;
    CombinedTask: ITask;
    begin
    // 创建一些任务
    SetLength(Tasks, 3);
    Tasks[0] := TTask.Run(procedure begin Sleep(1000); ShowMessage('任务1完成!'); end);
    Tasks[1] := TTask.Run(procedure begin Sleep(2000); ShowMessage('任务2完成!'); end);
    Tasks[2] := TTask.Run(procedure begin Sleep(3000); ShowMessage('任务3完成!'); end);
    // 等待所有任务完成
    CombinedTask := TTask.WhenAll(Tasks);
    CombinedTask.Wait;
    ShowMessage('所有任务都已完成!');
    end;

在这个例子中,WhenAll 方法等待所有提供的任务完成后才继续执行后续代码。
TTask 类提供了强大的异步编程功能,允许你以简单和高效的方式在 Delphi 应用程序中执行并发任务。通过理解 TTask 的基本和高级用法,你可以充分利用多核处理器的优势,提升应用程序的性能和响应速度。


本文由 王守红 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论