【问题标题】:Converting a task<T> to task<void>将 task<T> 转换为 task<void>
【发布时间】:2018-03-30 19:46:57
【问题描述】:

有没有办法简化以下代码以避免 .then 调用将我的task&lt;int&gt;“转换”为task&lt;void&gt;?

我无法更改 MyClass::MyFunction1 的函数签名,因为它是公共 API 的一部分。

task<void> MyClass::MyFunction1()
{
    return MyFunction2().then([](int) {});
}

task<int> MyClass::MyFunction2()
{
    // Some code here
}

【问题讨论】:

  • 什么是.then?
  • @Drise concurrency::task的成员函数

标签: c++ visual-c++ ppl


【解决方案1】:

concurrency::task 是一个模板类,因此concurrency::task&lt;int&gt; 和concurrency::task&lt;void&gt; 是两个不同的类。任何一个的实例都不能转换或转换为另一个。

因此,您的方法有些正确。但是,您没有进行转换,您只是创建了一个新的task&lt;void&gt; 实例,完成后将由Method2() 返回的task&lt;int&gt; 执行。这隐藏了一些您实际尝试做的事情,并且可能会使将来维护代码变得更加困难。我认为更好的方法是创建并返回一个封装Method2() 的task&lt;void&gt; 并等待它完成:

concurrency::task<void> MyFunction1()
{
    return concurrency::task<void>{[]()
    {
        MyFunction2().wait();
    }};
}

这更简单明了,特别是因为调用者收到的task&lt;void&gt; 实际上会执行MyFunction2() 正在执行的任何内容。

无论哪种方式,由于类型不兼容,因此无法创建新的task&lt;void&gt; 实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    相关资源
    最近更新 更多