7

我发现在为 TIdHTTP 组件设置 ConnectTimeoout 属性时,它会使请求(GET 和 POST)变慢大约 120 毫秒?

为什么会这样,我可以以某种方式避免/绕过它吗?

环境:D2010 带有随附的 Indy 组件,为 D2010 安装了所有更新。操作系统是 WinXP (32bit) SP3,带有大多数补丁...

我的计时程序是:

    Procedure DoGet;
    Var
       Freq,T1,T2 : Int64;
       Cli        : TIdHTTP;
       S          : String;
    begin
         QueryPerformanceFrequency(Freq);
         Try
            QueryPerformanceCounter(T1);
            Cli := TIdHTTP.Create( NIL );
            Cli.ConnectTimeout := 1000;  // without this we get < 15ms!!
            S := Cli.Get('http://127.0.0.1/empty_page.php');
         Finally
            FreeAndNil(Cli);
            QueryPerformanceCounter(T2);
         End;
         Memo1.Lines.Add('Time = '+FormatFloat('0.000',(T2-T1)/Freq) );
    End;

在代码中设置 ConnectTimeout 后,我​​得到了平均值。130-140ms的时间,没有它大约5-15ms ...

4

1 回答 1

14

ConnectTimeout为零(并且TIdAntifreeze不生效)时,Indy 简单地连接。否则,TIdIOHandlerStack.ConnectClient调用DoConnectTimeout,它创建一个新线程来进行连接,同时调用线程休眠并处理TIdAntifreeze操作,等待建立连接。如果在超时过去时没有连接,则会引发异常。

线程不是空闲的,调用线程总是会在检查连接线程是否完成任务之前休眠。默认睡眠持续时间为125 毫秒。(要使用其他东西,请激活TIdAntifreeze并将其IdleTimeout属性设置为低于 125。)

于 2010-05-05T14:03:43.917 回答