1

我第一次使用 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; 

第一次尝试

为此,它第一次工作正常,禁用按钮,为异步休眠,然后重新启用它。

但是我第二次单击该按钮时,它被禁用但永远不会再次启用。

第二次尝试

这次我想显示一条消息 x100 次,它第一次也可以工作,但是当我再次调用该过程时,我收到以下错误TOminCommunicationEndpoint.Send: Queue is full

使用过这个库的人可以向我解释一下,为什么会出现这个错误?如果它与第一次尝试的问题有关?

4

1 回答 1

2

您似乎遇到了 OTL 的内部限制。

每次调用 Async-Await 都会启动一个新线程并立即返回。循环完成后,您将得到 100 个线程,每个线程在执行 Await 代码之前等待 5 秒。

AFAIK,使用线程池时,OTL 中有 60 个并发线程的限制。

于 2014-04-08T06:05:42.807 回答