gpt4 book ai didi

multithreading - 超时后如何正确取消 LoadAsync

转载 作者:行者123 更新时间:2023-12-02 03:21:23 24 4
gpt4 key购买 nike

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

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

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

最佳答案

您的调用 t1.wait(); 是一个阻塞调用,如果 LoadAsync 调用由于某种原因失败,它将引发异常。在您的情况下,HRESULT 是 ERROR_OPERATION_ABORTED,这正是我所期望的(“由于线程退出或应用程序请求,I/O 操作已中止。”)

您可以做的是创建一个任务取消 token ,将其附加到您的任务,然后在需要时触发 token 取消。

来自 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());

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

关于multithreading - 超时后如何正确取消 LoadAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33114841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com