Tôi tương đối mới đối với các công cụ RestRequest. Tôi hy vọng ai đó đã giải quyết vấn đề chờ cuộc gọi async kết thúc ...Delphi Threading Với TRestRequest
Tôi có một chương trình tạo ra hàng trăm cuộc gọi api khác nhau, cuộc gọi sau đó xử lý kết quả và chuyển kết quả trở lại quy trình được gọi là sự thực hiện của api, sau đó có thể tiếp tục ...
Chỉ có vấn đề như khi thực hiện các cuộc gọi như vậy mà không cần luồng, là phần mềm bị treo cho đến khi cuộc gọi kết thúc ... Để thử và khắc phục điều này, tôi đã thay đổi RESTRequest.Execute;
thành RESTRequest.ExecuteAsync();
, nhưng bây giờ vấn đề của tôi là mã của tôi tiếp tục mà không cần chờ phản hồi của yêu cầu.
một lần nữa để cố gắng và bỏ qua vấn đề này, tôi đã cố gắng một số giải pháp, thậm chí api.RESTRequest.ExecuteAsync().WaitFor;
(mà ném một lỗi thread error: the handler is invalid (6)
)
Có cách nào tại tất cả những gì tôi có thể thay đổi các chức năng dưới đây để chạy như một sợi riêng biệt (chỉ phần thực thi là quan trọng để chạy trong chuỗi) ... Về cơ bản tôi chỉ muốn hiển thị một biểu tượng tải động mỗi khi hàm được gọi, và cho phần còn lại của mã của tôi để wat cho đến khi hàm này hoàn thành ...
Tôi hy vọng có một giải pháp đơn giản hơn để bắt đầu sử dụng đầy đủ trên đa luồng ..
Mã
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;
Nice câu trả lời, ngoại trừ "một cách mù quáng" .. –
@ John tôi có thể thấy sự nhầm lẫn - tôi chỉ có nghĩa là "mù quáng" như trong việc không ngay lập tức xem kết quả. Thay vào đó, một chuỗi mới hoạt động như một "người" khác để "thông báo" cho bạn về "những thay đổi" trong "chuỗi" ... Nói cách khác, một chuỗi khác chịu trách nhiệm thực hiện công việc và chuỗi cuộc gọi không cần phải quan tâm nhiều về các chi tiết chính xác. Họ chỉ muốn kết quả. Hãy nghĩ đến việc sinh ra một chủ đề mới, ví dụ, thuê một nhân viên mới có thể thực hiện một công việc cho bạn. Bạn cung cấp cho họ một nhiệm vụ, và bạn để cho họ đi theo cách của họ để làm nhiệm vụ đó, trong khi bạn tiếp tục với những thứ khác. –
Tôi biết những gì một cách mù quáng có nghĩa là, và nó là một sử dụng kém ở đây .. Tôi vẫn +1 câu trả lời của bạn. –