我第一次使用OTL,我试图使用异步/等待抽象。
现在,我创建了一个小程序,只是为了看看会发生什么。它只是一个按钮,它调用这个程序。
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; 第一次尝试
为此,它第一次很好地工作,禁用按钮,为异步睡眠,然后启用它。
但是当我第二次点击这个按钮时,它被禁用了,但是再也没有被启用过。
第二次尝试
这一次我想显示一个消息x100时间,它也是第一次工作,但当我再次调用该过程时,我得到以下错误TOminCommunicationEndpoint.Send: Queue is full
使用过这个库的人能向我解释一下为什么我会犯这个错误吗?如果这与第一次尝试的问题有关呢?
发布于 2014-04-08 06:05:42
似乎您正在触及OTL的内部限制。
每个对异步等待的调用都启动一个新线程并立即返回。当循环完成后,您将得到100个线程,每个线程在执行等待代码之前等待5秒。
AFAIK,在使用线程池时,OTL中有60个并发线程的限制。
https://stackoverflow.com/questions/22927195
复制相似问题