我第一次使用OTL而且我试图使用Async / Await抽象。
现在,我创建了一个小程序,看看会发生什么。它只是一个按钮,它调用此过程。
procedure TForm2.Button1Click(Sender: TObject);
var i : integer;
begin
Button1.enabled := false; //Only for second try
for i := 0 to 100 do
begin
Async(
procedure begin
sleep(5000);
end).
Await(
procedure begin
//First Try - Button1.Enabled := true;
//Second Try - showmessage('finished')
end
);
Button1.enabled := true; //Only for the second try.
end;
end;
首先尝试
为此,它第一次正常工作,禁用按钮,为asyncs休眠,然后再启用它。
但是第二次单击按钮时,它被禁用但从未再次启用。
第二次尝试
这次我想要显示一条消息x100次并且它第一次也能正常工作,但是当我再次调用该过程时,我收到以下错误TOminCommunicationEndpoint.Send: Queue is full
使用此库的人可以向我解释,为什么我会收到此错误?如果它与第一次尝试的问题有关?
答案 0 :(得分:2)
看来你正在达到OTL的内部限制。
每次调用Async-Await都会启动一个新线程并立即返回。循环完成后,最终会有100个线程,每个线程在执行Await代码之前等待5秒钟。
AFAIK,使用线程池时,OTL中有60个并发线程的限制。