我有一個函數調用Concurrency :: create_task在後臺執行一些工作。在該任務中,需要在類StreamSocket
上調用connectAsync
方法,以便將套接字連接到設備。一旦設備連接,我需要獲取連接套接字內的一些引用(如輸入和輸出流)。。在C++/cx中的任務.wait()拋出異常
由於它是一種異步方法,將返回一個IAsyncAction
,我需要在connectAsync
函數上創建另一個任務,我可以等待。這工作沒有等待,但是當我嘗試wait()
在這個內在的任務爲了錯誤檢查而出現複雜化。
Concurrency::create_task(Windows::Devices::Bluetooth::Rfcomm::RfcommDeviceService::FromIdAsync(device_->Id))
.then([ this ](Windows::Devices::Bluetooth::Rfcomm::RfcommDeviceService ^device_service_)
{
_device_service = device_service_;
_stream_socket = ref new Windows::Networking::Sockets::StreamSocket();
// Connect the socket
auto inner_task = Concurrency::create_task(_stream_socket->ConnectAsync(
_device_service->ConnectionHostName,
_device_service->ConnectionServiceName,
Windows::Networking::Sockets::SocketProtectionLevel::BluetoothEncryptionAllowNullAuthentication))
.then([ this ]()
{
//grab references to streams, other things.
}).wait(); //throws exception here, but task executes
基本上,我已經想通了,創建初始任務連接在同一個線程(大概是UI),還執行任務和內部任務。每當我嘗試從外部任務調用.wait()
的內部任務時,我立即得到一個異常。但是,內部任務將完成併成功連接到設備。
爲什麼我的異步鏈在UI線程上執行?我如何正確地等待這些任務?
您是否嘗試過記錄異常?它可能會回答爲什麼它被拋出。 – Siguza
我有,它實際上不是一個例外,是拋出。我似乎無法捕捉到任何缺少全面捕捉(...)的東西。我試過了platform :: exception,並且關於我能想到的每種數據類型。 – turkycat
也嘗試過'void *'和'nullptr_t'嗎? – Siguza