使用XE7并行库中的TTask

  上篇文章学习使用System.Threading单元提供的并行编程和TParallel.For提升循环的执行效率。当需要运行多任务而不是一个循环时,也可以使用并行方式。
  使用System.Threading.TTask和System.Threading.ITask可方便的串行执行几个进程.使用TTask类创建任务,使用ITask接口实例管理进程的交互。在代码完成处理前可以使用WaitForAll或WaitForAny等待任务完成.
例如,假设有两个任务A和B.如果一个任务用时3秒,另一个用时5秒,用户得到运行结果需要多长时间呢?
  •串行 (未使用TTask / ITask) = 8秒.
  •使用TTask.WaitForAll = 5秒
  •使用TTask.WaitForAny = 3秒
根据任务的不同,获取返回值的效率可显著提高.下面看看WaitForAll范例.

procedure TFormThreading.MyButtonClick(Sender: TObject);
var
 tasks: array of ITask;
 value: Integer;
begin
 Setlength (tasks ,2);
 value := 0;

 tasks[0] := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     TInterlocked.Add (value, 3000);
   end);
 tasks[0].Start;

 tasks[1] := TTask.Create (procedure ()
   begin
     sleep (5000); // 5 seconds
     TInterlocked.Add (value, 5000);
   end);
 tasks[1].Start;

 TTask.WaitForAll(tasks);
 ShowMessage ('All done: ' + value.ToString);
end;

 上例使用ITask数组管理一系列任务.结果返回8000,尽管共Sleep了8秒,但前3秒是并行运行的,2秒后第二个任务也完成了,相当于前3秒两个任务同时运行;注意这里并没有创建自定义线程以及管理返回值。

当然提升获取返回值程序的执行效率是很有用的,也可使用TTask执行后台任务避免UI阻塞,要实现这个目标,只需启动一个单独的任务并运行,例如:

procedure TFormThreading.Button1Click(Sender: TObject);
var
 aTask: ITask;
begin
 // not a thread safe snippet
 aTask := TTask.Create (procedure ()
   begin
     sleep (3000); // 3 seconds
     ShowMessage ('Hello');
   end);
 aTask.Start;
end;

第二个范例可让用户多次点击按钮,调用多次ShowMessage,实际开发中可以使用这种高效的方式运行实际任务。这也是异步编程的范例:启动任务,执行其他代码后,处理任务的返回结果。

ITask

ITask提供了一系列方法和属性控制任务,包括启动(Start)、等待(Wait)、取消(Cancel)、获取状态(Created, WaitingToRun, Running, Completed, WaitingForChildren, Canceled, Exception)。ITask是一个接口,可创建TTask类实例后,赋给ITask变量,增加框架的可扩展性.

根据测试,TTask相当于启动了一个子线程,上篇文章指出是基于一个线程池的。
在Delphi中,TTask是一个用于处理异步任务的类。它可以让开发者更加方便地处理异步操作,提高程序的并发性能。 TTask使用方法如下: 1.创建TTask对象 可以使用TTask类的静态方法TTask.Run来创建一个TTask对象,例如: ``` var Task: ITask; begin Task := TTask.Run( procedure begin // 处理异步任务 // ... end ); ``` 在上面的代码中,使用TTask.Run方法创建一个TTask对象,该对象将在后台线程中执行指定的匿名方法。 2.等待异步任务完成 如果需要等待异步任务完成后再继续执行后续操作,可以使用TTask.Wait方法等待任务完成,例如: ``` var Task: ITask; begin Task := TTask.Run( procedure begin // 处理异步任务 // ... end ); Task.Wait; // 异步任务完成后的后续操作 // ... end; ``` 在上面的代码中,使用Task.Wait方法等待异步任务完成后再执行后续操作。 3.异步任务取消 如果需要取消异步任务,可以使用TTask.Cancel方法取消任务,例如: ``` var Task: ITask; begin Task := TTask.Run( procedure begin while not TTask.CurrentTask.Status = TTaskStatus.Canceled do begin // 处理异步任务 // ... end; end ); // 取消异步任务 Task.Cancel; end; ``` 在上面的代码中,使用Task.Cancel方法取消异步任务。在异步任务的处理程序中,需要检查任务是否已被取消,如果已经被取消,应该立即退出任务。 需要注意的是,TTask并不是适用于所有异步操作的最佳方案,有些情况下可能需要使用其他的异步处理方式,例如线程池、异步委托等。在使用TTask时,需要根据具体情况进行选择和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值