TTask 类是 System.Threading.TTask 命名空间下的一个类,用于实现异步编程。TTask 提供了一种简单而强大的方式来执行并发任务,而不需要深入处理线程的低级细节。
一、简介
TTask 类允许你以异步方式执行代码,并且提供了一些高级功能,如任务的等待、取消和结果返回。它基于 System.Threading 命名空间,是 Delphi 异步编程框架的重要组成部分。
二、基本用法
- 创建和运行一个简单任务
你可以使用 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 在后台线程中执行任务,所以主线程不会被阻塞。
等待任务完成
有时候你可能需要等待一个任务完成后再继续执行后续代码。你可以使用 TTask 的 Wait 方法来实现这一点。procedure TForm1.Button2Click(Sender: TObject);
var
Task: ITask;
begin
Task := TTask.Run(
procedure
begin
Sleep(2000); // 模拟耗时操作
end
);
// 等待任务完成
Task.Wait;
ShowMessage('所有任务已完成!');
end;
在这个例子中,ShowMessage 会在任务完成后才会被调用。
返回结果的任务
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
三、高级用法
取消任务
你可以使用 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;
在这个例子中,任务会在检查到取消请求后被取消。
组合任务
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 的基本和高级用法,你可以充分利用多核处理器的优势,提升应用程序的性能和响应速度。
还不快抢沙发