HTTP帖子未完成时表单被阻止

Man*_*ini 0 delphi json indy idhttp

我将JSON发送到端点,我遇到了问题.执行工作正常,但是在HTTP.Post()完成屏幕发布以供使用之后,表单会一直停滞到结束.我确定我做错了什么.

以下是发送JSON的按钮操作:

procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  vJsonAEnviar: TStringStream;
  Json:String;
begin
  Json := '{ '+
          ' "user":"Lucy"'+
          ' "execute":"ok"'+
          ' } ';
  HTTP := TIdHTTP.Create;
  HTTP.Request.ContentType := 'application/json';
  HTTP.Request.UserAgent := 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0';
  vJsonAEnviar := TStringStream.Create(UTF8Encode(Json));
  HTTP.Post('http://localhost:8080/exportaManual', vJsonAEnviar);
  FreeAndNil(HTTP);
  FreeAndNil(vJsonAEnviar);
end;
Run Code Online (Sandbox Code Playgroud)

另一方面,它需要一段时间才能完成并且屏幕会长时间停留.

Rem*_*eau 6

你没有做错任何事(好吧,除了完全没有任何错误处理).这就是Indy的设计操作(参见Indy简介).Indy使用阻塞套接字操作.执行操作时,将阻止调用线程,直到操作完成.这个是正常的.

如果您不希望POST在正在进行的过程中冻结UI ,您可以:

  • TIdAntiFreeze组件放到表单上.当Indy阻止主UI线程时,它将在后台泵送UI消息.

  • 移动POST代码到自己的工作线程,使用TThread,TTask,TIdThreadComponent等,并已经完成时,它通知主UI线程.