【发布时间】:2014-12-03 18:46:55
【问题描述】:
我正在 Rad Studio XE7 中构建一个 Firemonkey 应用程序,单击一个按钮,我将需要使用 TRESTRequest 执行多个(大约 7 个)Web 服务调用。每个 Web 服务都将返回 json 对象,然后该对象将填充数据集。 我正在寻找一种同时进行这些调用的方法,并且没有要锁定应用程序的 UI。
您建议采用哪种方式执行此操作?我看到 Embarcadero 为线程引入了新的任务和特性功能,但我仍然不确定我们是否可以使用它以及如何使用它。另外,我看到有一个函数可以异步执行TRESTRequest,使用这个函数:
function TCustomRESTRequest.ExecuteAsync(ACompletionHandler: TCompletionHandler = nil; ASynchronized: boolean = true; AFreeThread: boolean = true): TRESTExecutionThread;
但我找不到有关如何使用此方法及其作用的任何文档。
任何意见将不胜感激。
【问题讨论】:
-
@JerryDodge 不异步暗示它不会阻塞?最终异步操作将终止,应用程序可以对结果执行某些操作。
-
@mjn 在我们将调用这 7 个 Web 服务的地方单击这个按钮实际上会打开一个多视图,在我们的例子中将包含一堆过滤组合框,这些组合框将通过从 Web 服务获取数据来填充。我的想法是让用户能够实际取消此过滤,然后通过触摸多视图之外的区域返回,这将关闭多视图并且不应用任何过滤器。多个并行请求的想法是,我们认为如果我们并行发送 7 个请求而不是一次发送一个请求,这 7 个组合框的填充速度会更快。
-
@JerryDodge 您应该在后台执行 all 长时间运行的任务,以防止 UI 线程阻塞。这不仅适用于用户,而且操作系统也在寻找没有响应的应用程序。
-
@JerryDodge f.i.如果应用程序由于没有响应而被冻结,Android 将弹出一个对话框。所以这样做是必须的。对不起,我无法理解你问为什么的意思。感觉就像在问“你为什么不想开车穿过邻居的花园?” :o)
-
@JerryDodge 这肯定是正确的选择 - 没有任何可接受的良好工作选项
标签: multithreading delphi rest asynchronous