如何使用TIdHTTP停止(取消)下载

6

我在一个线程中使用TIdHTTP.Get过程下载文件。我的问题是如何停止(取消)文件的下载?

2个回答

14

我会尝试在TIdHTTP.OnWork事件中使用Abort方法抛出一个静默异常来取消它。这个事件会在读写操作时触发,所以它也会在你的下载进度中触发。

type
  TDownloadThread = class(TThread)
  private
    FIdHTTP: TIdHTTP;
    FCancel: boolean;
    procedure OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode; 
      AWorkCount: Integer);
  public
    constructor Create(CreateSuspended: Boolean);
    property Cancel: boolean read FCancel write FCancel;
  end;

constructor TDownloadThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
  FIdHTTP := TIdHTTP.Create(nil);
  FIdHTTP.OnWork := OnWorkHandler;
end;

procedure TDownloadThread.OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if FCancel then
  begin
    FCancel := False;
    Abort;
  end;
end;

或者,如此处所述,对于直接断开连接,您可以在同一事件中使用Disconnect方法。

procedure TDownloadThread.OnWorkHandler(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCount: Integer);
begin
  if FCancel then
  begin
    FCancel := False;
    FIdHTTP.Disconnect;
  end;
end;

OnWorkHandler 事件中调用 FIdHTTP.Disconnect 是否更好? - Salvador
@Salvador - 如果您不再从FIdHTTP保持连接,那么一定会这样做。重要的是在OnWork事件中进行操作,以在下载过程中中断下载。 - user532231
3
在进行HTTP请求时,您不能在中途取消请求并期望保持连接处于打开状态。这样做会导致套接字处于不确定的状态,并且可能已经传输了一些数据。无法清除HTTP连接并将其保持为打开状态以进行新的请求。最好的做法是关闭连接。 - Remy Lebeau

5
你可以使用默认过程 idhttp1.Disconnect...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接