我對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你的答案。 –