考虑我使用的是线程,它在Windows :: Storage :: Streams :: DataReader(m_reader)的帮助下从网络套接字(Windows :: Networking :: Sockets :: StreamSocket)读取数据流。我需要停止这个线程,它主要在LoadAsync中等待。如何在超时后正确取消LoadAsync方法?
auto t1 = create_task(m_reader->LoadAsync(sizeof(len)));
t1.wait();
我尝试了几种方法,但都没有正常工作。或者我不能使用DataReader,我必须选择其他方法吗?
答案 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
异常,因此您需要捕获并处理该异常。