在超时后如何正确取消LoadAsync

时间:2015-10-14 00:41:20

标签: multithreading windows-store-apps c++-cx

考虑我使用的是线程,它在Windows :: Storage :: Streams :: DataReader(m_reader)的帮助下从网络套接字(Windows :: Networking :: Sockets :: StreamSocket)读取数据流。我需要停止这个线程,它主要在LoadAsync中等待。如何在超时后正确取消LoadAsync方法?

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

我尝试了几种方法,但都没有正常工作。或者我不能使用DataReader,我必须选择其他方法吗?

1 个答案:

答案 0 :(得分: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()); 

注意:对取消令牌调用cancel将导致该任务抛出task_canceled异常,因此您需要捕获并处理该异常。