我目前正在使用boost :: asio :: io_service使用異步休息客戶端。 我試圖讓客戶端作爲更大程序的某種服務。 這個想法是,客戶端將執行異步http請求到一個休息API,獨立於運行主程序的線程。所以在客戶端內部會有另一個線程等待請求發送。 要通過請求客戶端我使用的是io_service對象和io_service對象::工作與io_service對象初始化。我幾乎重用了本教程給出的示例 - logger_service.hpp。 我的問題是,當它們在示例中將工作發佈到服務時,被調用的處理程序是一個簡單的函數。在爲我作出異步調用像這樣我的情況 (我已經做了必要的運行以下對象的所有instancies有的更在某種程度上能夠建立網絡連接):升壓異步休息客戶端
boost::asio::io_service io_service_;
boost::asio::io_service::work work_(io_service_); //to prevent the io_service::run() to return when there is no more work to do
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> socket_(io_service_);
在主程序我做以下電話:
client.Connect();
...
client.Send();
client.Send();
...
某些客戶端的僞代碼:
void MyClass::Send()
{
...
io_service_.post(boost::bind(&MyClass::AsyncSend, this);
...
}
void MyClass::AsyncSend()
{
...
boost::io_service::asio::async_write(socket, streamOutBuffer, boost::bind(&MyClass::handle_send, this));
...
}
void MyClass::handle_send()
{
boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this));
}
void MyClass::handle_read()
{
// ....treatment for the received data...
if(allDataIsReceived)
FireAnEvent(ReceivedData);
else
boost::io_service::asio::async_read(socket, streamInBuffer, boost::bind(&MyClass::handle_read, this));
}
由於它的文檔中描述'後'方法請求io_service調用給定的處理程序和立即返回。我的問題是,嵌套的處理程序,例如AsyncSend中的:: handle_send,在使用post()後立即調用(當http響應已準備就緒時)?或者處理程序將以與post()調用順序定義的順序不同的順序調用? 我問這個問題,因爲當我只打一次客戶端 - >發送()客戶端似乎「工作正常」。但是當我連續進行2次調用時,如上例所示,客戶端無法完成第一次調用,而是執行第二次調用,並且在最後一些混亂執行後,2次操作失敗。
有沒有什麼辦法來做我所描述的執行完整的異步鏈,然後執行另一個。
我希望,我跟我的描述:)
你可以讓它同步或添加一個條件變量來檢查前面的調用是否完成。 (假設你正確處理SSL連接) – Blacktempel