Delphi REST请求异步

Emm*_*oli 0 delphi

我已经构建了后端(使用WebBroker)并且它有一些API.所以在客户端我将使用REST组件来获取json并解析它.这是一个例子:

procedure TForm1.ButtonCreateClick(Sender: TObject);
begin

 //rreqTodoCreate is a TRESTRequest component!

 rreqTodoCreate.Params[0].Value := EditTitle.Text;
 rreqTodoCreate.Params[1].Value := EditCategory.Text;

 rreqTodoCreate.ExecuteAsync(procedure
                             begin
                              ResponseEdit.Text := rrespToDo.Content;
                             end);

end;
Run Code Online (Sandbox Code Playgroud)

我正在使用ExecuteAsyncdocwiki建议,因为我在移动设备上,我不希望UI冻结!我已经读过,它ExecuteAsync运行在一个单独的线程上,所以我有一个疑问.

我编写的代码是否是线程安全的?或换句话说:当我更新主窗体中组件的文本时,我应该使用队列还是同步?

Rem*_*eau 5

根据TRESTRequest.ExecuteAsync()文件:

参数

此方法定义以下参数:

  • ACompletionHandler - 指定在完成请求执行后要运行的匿名方法.
  • ASynchronized- 当为True时,指定ACompletionHandler在主线程上下文中运行的方法集.当为False时,ACompletionHandler在执行线程上下文中运行.
  • AFreeThread - 如果为True,则在完成请求执行后释放执行线程.

ASynchronized参数True默认为:

function ExecuteAsync(
  ACompletionHandler: TCompletionHandler = nil;
  ASynchronized: Boolean = True;  // <--
  AFreeThread: Boolean = True;
  ACompletionHandlerWithError: TCompletionHandlerWithError = nil): TRESTExecutionThread;
Run Code Online (Sandbox Code Playgroud)

因此,您显示的代码完全没问题,分配ResponseEdit.Text是线程安全的.