我对RestRequest工具相对较新。我希望有人已经解决了等待异步调用完成的问题...德尔福线程与TRestRequest
我有一个程序,使数百个不同的api调用,然后调用处理结果,并将结果传回给过程这就叫api的执行,然后可以继续...
只有在没有线程的情况下进行这种调用时,一直存在的问题是软件挂起,直到调用完成...为了尝试和解决这个问题,我将RESTRequest.Execute;
更改为RESTRequest.ExecuteAsync();
,但现在我的问题是我的代码继续而不等待restrequest的响应。再次
,试图绕过这个问题,我已经尝试了几种解决方案,甚至api.RESTRequest.ExecuteAsync().WaitFor;
(这会引发错误thread error: the handler is invalid (6)
)
有没有什么办法可言,我可以改变以下功能作为一个单独的线程中运行(只有执行部分是重要的线程运行)...基本上我只是想显示一个动画加载图标,每次调用该函数,并为我的代码的其余部分,以笏,直到此功能完成...
我希望有一个更简单的解决方案,而不是开始使用多线程完全。
代码
function run_api_command():boolean;
begin
result := false;
RESTResponse.Content.Empty;
RESTAdapter.Dataset:= ds_action;
RESTAdapter.RootElement:= '';
try
RESTRequest.ExecuteAsync;
if(ds_action.Active = false) then ds_action.Active:=true;
if(ds_action.FieldByName('result').AsString<>'Success') then
begin
showmessage(ds_action.FieldByName('result').AsString);
end
else
begin
RESTAdapter.RootElement:= 'data';
result := true;
end;
except
on E: Exception do
begin
if(e.Message = 'REST request failed: Error sending data: (12007) The server name or address could not be resolved') then
begin
if(messagedlg('Could not connect to server. Would you like to retry?', mterror,[mbYes,mbNo],0)=mrYes) then
begin
result := run_api_command();
end;
end
else
begin
showmessage(RESTResponse.Content);
end;
end;
end;
end;
尼斯的答案,以异常的“盲目” .. –
@约翰我可以看到混乱 - 我只是“盲目”的意思,因为没有立即观察结果。相反,一个新的线程作为另一个“人”来“告知”你“线程”中的“变化”......换言之,另一个线程负责工作,调用线程不必关心关于确切的细节。他们只是想要结果。想想产生一个新线索,比如说雇用一个能为你工作的新员工。你给他们一个任务,你让他们去完成这个任务,而你继续其他事情。 –
我知道什么是盲目的,这是一个很糟糕的用途。我仍然+1你的答案。 –