2015-10-14 15 views
3

考慮到我正在使用線程,它使用Windows :: Storage :: Streams :: DataReader(Windows :: Networking :: Sockets :: StreamSocket)從網絡套接字(Windows :: Networking :: Sockets :: StreamSocket)讀取數據流m_reader)。我需要停止這個線程,它主要在LoadAsync中等待。如何在一些超時後正確取消LoadAsync方法?在某些超時後如何正確取消LoadAsync

auto t1 = create_task(m_reader->LoadAsync(sizeof(len))); 
t1.wait(); 

我嘗試了幾種方法,但都沒有正常工作。或者我不能使用DataReader,我必須選擇其他方法?

+0

只需關閉插座。不可避免的是,必須並將結束LoadAsync()。如果套接字因某種原因需要存活,則使用CancelIOAsync()。 –

+0

我現在這樣做,但它會引發一些血腥的異常:Platform :: COMException ^在內存位置0x1242EB18。 HRESULT:0x800703E3。我想知道是否有一個更清潔的方式沒有這個例外... – wallycz

回答

1

您的呼叫t1.wait();是一個阻塞呼叫,如果LoadAsync呼叫由於某種原因失敗將會引發異常。在你的情況下,該HRESULT是ERROR_OPERATION_ABORTED,這是我所期望的(「由於線程退出或應用程序請求,I/O操作已中止)。任務取消令牌,將其附加到您的任務,然後在需要時啓用令牌取消。

https://technet.microsoft.com/en-us/office/hh780559

//Class member: 
cancellation_token_source m_fileTaskTokenSource; 

// Cancel button event handler: 
m_fileTaskTokenSource.cancel(); 

// task chain 
auto getFileTask2 = 
    create_task(documentsFolder->GetFileAsync(fileName), 
           m_fileTaskTokenSource.get_token()); 

注:呼籲取消的取消標記將導致任務拋出一個task_canceled異常,所以你需要捕獲和處理這個異常。

+1

可能是最好的解決方案,但經過一些測試有時它會拋出0x800703E3而不是task_canceled: - /所以不完全可靠 – wallycz