简介
一个协程可以支持多个作用域,比如:.scopes([form1, form2, form3]),作用域关闭,则这个作用域下面的所有协程都会被取消并关闭;
若一个作用域下,挂载一个协程A,这个协程A 又会衍生成百上千的子协程,此时只需要给这个协程A设置一下作用域就可以了,没有必要 A衍生的子协程也设置作用域,因为作用域关闭,A协程也就关闭,A协程衍生的所有协程都会关闭;
示例代码
主窗体的代码
unit main;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;typeTFormMain = class(TForm)Button1: TButton;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varFormMain: TFormMain;implementation{$R *.dfm}uses Unit1;procedure TFormMain.Button1Click(Sender: TObject);
begin{动态创建一个窗体,在这个窗体上开启很多协程,然后不等协程执行完,我们就关闭此窗体,这个作用域窗体上挂载的协程会统一立即被连带关闭}with TForm1.Create(nil) do //注意 AOwner要为 NilbeginShowModal;Free; //用完窗体正常释放就行end;
end;end.
动态创建的 form1 代码
unit Unit1;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Controls, Vcl.Forms, Vcl.Dialogs, doroutine, Vcl.StdCtrls;typeTForm1 = class(TTaskForm) //这里这个窗体要继承 TTaskFormButton1: TButton;Memo1: TMemo;procedure Button1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }procedure ui1(task: TTask);end;varn: Integer;implementation{$R *.dfm}procedure bgSmall(task: TTask);
begin//doSomeThing http 请求了,或其他 后台业务Sleep(500); //模拟做事//可看下日志OutputDebugString(PChar(Format('干完了第: %d 个,后,由于作用域关闭了,剩下的不干了!', [AtomicIncrement(n)])));
end;procedure bgBig(task: TTask);
begin//此大协程开启3000个bg小协程做事for var i := 1 to 3000 dobegintask.bg(bgSmall).start;end;
end;procedure TForm1.ui1(task: TTask);
beginMemo1.Lines.Add(n.ToString);
end;procedure TForm1.Button1Click(Sender: TObject);
begin{衍生1个bg大协程,这个协程内部又衍生3000个小协程,我们只需要设置一下这个 大协程的作用域就可以了,那3000个小协程的作用域没有必要设置,因为协程是连带关闭的,关闭父亲,父亲衍生的都会连带关闭}task.bg(bgBig).scopes([Self]).start;//再衍生1个ui重复协程,1秒执行一次task.ui(ui1).scopes([Self]).interval(1000).start;
end;end.