program main;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
OtlParallel;
begin
Parallel.Async(procedure
var
i: Integer;
begin
for I := 0 to 100 do
Writeln(Format('No.%d', [i]));
end);
Writeln('执行一');
Sleep(100);
Writeln('执行二');
Sleep(100);
Writeln('执行三');
Sleep(100);
Readln;
end.
输出结果:
程序非常简单
引用OtlParallel.pas单元 创建一个匿名函数控制台输出1..10
跟进源码看到下面两个函数
procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig);
TOmniTaskDelegate = reference to procedure(const task: IOmniTask);//TOmniTaskDelegate 任务委托声明
procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig);
第一个函数Async 接受一个TProc的匿名函数, taskConfig默认为nil (IOmniTaskConfig应该是设置任务的一些属性后面在研究)
实际内部调用用了Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig)
方便使用
class procedure Parallel.Async(task: TProc; taskConfig: IOmniTaskConfig); begin Async( procedure (const omniTask: IOmniTask) begin task; end, taskConfig ); end; { Parallel.Async } class procedure Parallel.Async(task: TOmniTaskDelegate; taskConfig: IOmniTaskConfig); var omniTask : IOmniTaskControl; terminated: TOmniTaskConfigTerminated; begin if assigned(taskConfig) then (taskConfig as IOmniTaskConfigInternal).DetachTerminated(terminated); omniTask := CreateTask(task, 'Parallel.Async').Unobserved.OnTerminated( procedure (const task: IOmniTaskControl) var exc: Exception; begin terminated.Call(task); exc := task.DetachException; if assigned(exc) then raise exc; end ); Parallel.ApplyConfig(taskConfig, omniTask); omniTask.Unobserved; omniTask.Schedule(GetPool(taskConfig)); end; { Parallel.Async }