超时后如何正确取消 LoadAsync
How correctly cancel LoadAsync after some timeout
考虑到我正在使用线程,它在 Windows::Storage::Streams::DataReader (m_reader) 的帮助下从网络套接字 (Windows::Networking::Sockets::StreamSocket) 读取数据流.我需要停止这个线程,它主要在 LoadAsync 中等待。如何在超时后正确取消 LoadAsync 方法?
auto t1 = create_task(m_reader->LoadAsync(sizeof(len)));
t1.wait();
我尝试了几种方法,但 none 工作正常。或者我不能使用 DataReader 而必须选择其他方法?
您的调用 t1.wait();
是一个阻塞调用,如果 LoadAsync
调用由于某种原因失败,它将引发异常。在您的情况下,HRESULT 是 ERROR_OPERATION_ABORTED,这正是我所期望的 ("The I/O operation has been aborted because of either a thread exit or an application request.")
您可以做的是创建一个任务取消令牌,将其附加到您的任务,然后在需要时触发令牌取消。
来自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
异常,因此您需要捕获并处理该异常。
考虑到我正在使用线程,它在 Windows::Storage::Streams::DataReader (m_reader) 的帮助下从网络套接字 (Windows::Networking::Sockets::StreamSocket) 读取数据流.我需要停止这个线程,它主要在 LoadAsync 中等待。如何在超时后正确取消 LoadAsync 方法?
auto t1 = create_task(m_reader->LoadAsync(sizeof(len)));
t1.wait();
我尝试了几种方法,但 none 工作正常。或者我不能使用 DataReader 而必须选择其他方法?
您的调用 t1.wait();
是一个阻塞调用,如果 LoadAsync
调用由于某种原因失败,它将引发异常。在您的情况下,HRESULT 是 ERROR_OPERATION_ABORTED,这正是我所期望的 ("The I/O operation has been aborted because of either a thread exit or an application request.")
您可以做的是创建一个任务取消令牌,将其附加到您的任务,然后在需要时触发令牌取消。
来自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
异常,因此您需要捕获并处理该异常。