【问题标题】:Windows PPL(C++): Is this the correct way to test if a task is done?Windows PPL(C++):这是测试任务是否完成的正确方法吗?
【发布时间】:2016-09-05 12:24:10
【问题描述】:

这是测试任务是否完成的正确方法吗?

const concurrency::task<void> voidTask;
if (voidTask != m_getInfoAsync)
{
    if (!m_getInfoAsync.is_done())
    {
        return 0;
    }
}
if (voidTask != m_getRangeAsync)
{
    if (!m_getRangeAsync.is_done())
    {
        return 0;
    }
}

【问题讨论】:

    标签: windows winrt-async ppl


    【解决方案1】:

    虽然task::is_done是测试任务是否完成的正确方法,但我建议不要使用它。如果is_done 返回 false,那么当您开始根据该事实采取行动时,任务可能已经完成。这个功能非常活泼,更不用说这个功能可能需要一些同步,这可能会减慢程序的速度。

    相反,只需链接一个延续或使用co_await。在那里处理完成的任务。

    【讨论】:

    • 我在同步代码中使用异步 API (XboxLive)(对此我无能为力)。这是一项功能的一部分,该功能在开始新操作之前测试是否已完成任何先前的操作。由于我对并发 RT 基本上一无所知(我正在阅读它),我的第一个解决方案是在异步操作开始之前设置一个变量,然后在 .then 中将变量设置为 false。
    • @Zingam 坏主意。将这些任务链接起来,而不是询问它们是否完成。
    • 我该怎么做?我正在实现一个接口(虚拟函数)getInfoAsync()、isAsyncComplete()、getRangeAsync()。在这种情况下,异步意味着这些任务在单独的线程中运行。它们由触发系统调用。这些接口已经为几个不同的平台和不同的 API 实现了。无论如何,我会记住你的建议。
    猜你喜欢
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2013-09-25
    相关资源
    最近更新 更多