【问题标题】:winrt::fire_and_forget, What does this do?winrt::fire_and_forget,这是做什么的?
【发布时间】:2021-01-06 10:23:21
【问题描述】:

我正在将 C++/CX 应用程序移植到 C++/WinRT 核心应用程序。

我在此链接中找到了一个有用的示例代码 (Simple3DGameDX)。

https://github.com/microsoft/Windows-universal-samples/tree/master/Samples/Simple3DGameDX/cppwinrt

并且它的 Suspending 方法的返回类型是 winrt::fire_and_forget。 但是在 C++/CX 中的另一个例子,它的 Suspending 方法的返回类型是 void。

为什么这个返回类型在 C++/WinRT 中不是 void? 这有什么作用?

C++/WinRT

winrt::fire_and_forget OnSuspending(IInspectable const& /* sender */, SuspendingEventArgs const& args)

C++/CX

void OnSuspending(Object^ Sender, SuspendingEventArgs^ Args)

【问题讨论】:

  • 如果你熟悉 C#,fire_and_forget 就像 C# 中的“async void”作为返回类型。该方法不返回任务,但您可以在其中“等待...”。
  • 如果答案已经解决了您的问题,请mark它被接受

标签: c++-winrt c++-coroutine


【解决方案1】:

为什么这个返回类型在 C++/WinRT 中不是 void?这有什么作用?

除了Fire and forget 的文档外,请注意以下几点:函数本身在其主体中使用co_await 运算符。

这要求函数本身是协程友好的,并且可以编译成“无堆栈”形式,用于异步执行。 void 返回类型不起作用,但 fire_and_forget 结构没问题,因为 C++/WinRT 为其定义了协程处理,如文档所述。

将其视为void,它可以是异步的,无需等待。

【讨论】:

    【解决方案2】:

    winrt::fire_and_forget,这是做什么的?

    请参考文档here

    有时,您有一个任务可以与其他工作同时完成,您不需要等待该任务完成(没有其他工作依赖它),也不需要它返回一个值。在这种情况下,您可以启动任务并忘记它。您可以通过编写一个返回类型为winrt::fire_and_forget 的协程来做到这一点(而不是 Windows 运行时异步操作类型之一,或 concurrency::task)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      • 1970-01-01
      • 2012-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多