我已经构建了后端(使用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
在一个单独的线程上运行,所以我有一个疑问。
我编写的代码是否是线程安全的?换句话说:当我更新主窗体中组件的文本时,我应该使用队列还是同步?
答案 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);
说明: