Delphi REST请求异步

时间:2017-08-23 12:20:34

标签: 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;

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

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

2 个答案:

答案 0 :(得分:5)

根据TRESTRequest.ExecuteAsync() documentation

  

参数

     

此方法定义以下参数:

     
      
  • 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;

因此,您显示的代码完全正常,ResponseEdit.Text的赋值是线程安全的。

答案 1 :(得分:1)

是的,我也认为这更好:

rreqTodoCreate.ExecuteAsync(procedure
                            begin
                              TThread.Queue(procedure 
                                            begin
                                              ResponseEdit.BeginUpdate;
                                              ResponseEdit.Text := rrespToDo.Content;
                                              ResponseEdit.EndUpdate;
                                            end;   
                            end);

说明:

  1. TThread.Queue在主线程中执行匿名方法
  2. BeginUpdate和EndUpdate冻结用户界面并加快表单
  3. 的更新