使用Indy时连接不会超时

WeG*_*ars 6 delphi indy10

我想从互联网上下载一个文件,我想这应该是一个简单的任务.尝试了几种不同的方法,我发现每种方法都有自己的缺点.主要问题是:

  • 应用程序冻结,直到下载文件
  • 如果Internet连接丢失/服务器没有响应,应用程序将永久冻结.

(细节:

如何通过HTTP从Internet检索文件?
从Internet下载文件时连接不会超时)

所以,最后我使用了我从几个人那里得到的建议来使用像Indy这样的"专业"库.但是,Indy并没有比我尝试过的代码要好得多(但它更大,更难维护).使用Indy时,应用程序不会仅在短时间内冻结,因此它仍然(某种程度上)可用.但是,在下载完成之前无法关闭应用程序(从不会因为Internet连接中断而关闭).

其他人报告了同样的问题:http://borland.newsgroups.archived.at/public.delphi.internet.winsock/200609/0609079112.html
https://forums.embarcadero.com/thread.jspa?threadID=25199&tstart= 90

那么,为了让它发挥作用,我必须对TIDAntiFreeze进行一些黑客攻击?

此外,无法识别ConnectTimeout属性.

fIDHTTP := TIDHTTP.Create(NIL);
fIDHTTP.ConnectTimeout:=5000;
Run Code Online (Sandbox Code Playgroud)

我应该放弃Indy并回到最初在单独的线程中下载文件的想法,并在它没有响应时结束线程(至少这样我摆脱了第三方库)?如果我这样做会有不可预见的副作用吗?

使用:Delphi 7,Indy 10.1.5 10.5(可能).

谢谢

Dai*_*tsu 0

解决这类问题并不是太难。您要做的第一件事是确保您已正确处理错误。如果出现问题,请确保一切都正确清理。除此之外,请确保下载代码是单独线程的一部分。如果出现任何问题,您可以随时从主程序终止线程。这是对我来说工作正常的代码(仅用于下载,而不是线程)。

with TDownloadURL.Create(nil) do
  try
    URL := 'myurltodownload.com';
    filename := 'locationtosaveto';
    try
      ExecuteTarget(nil);
    except
      result := false;
    end;
    if not FileExists(filename) then
      result := false;
  finally
    clear;
    free;
  end;
Run Code Online (Sandbox Code Playgroud)