【问题标题】:Is there a substitution for C#'s await in C++/CX? Win10在 C++/CX 中是否有 C# 的 await 替代品?赢10
【发布时间】:2016-02-09 05:37:00
【问题描述】:

UWP、Win10、C++/CX

我想在 C++/CX 中同步使用 WinRT 异步函数,就像 C# 的 await 一样。在 C++/CX 中是否可以替代 C# 的 await?

我看过__await这篇文章,但是不起作用,可能是win8的,win10不支持,或者我错了。

顺便说一句,Concurency::create_task(option).get() 满足我的需要,但是太长了,它不能在 UI 线程上工作(我不知道为什么,如果你知道,你能告诉我吗?)

谢谢你:)

【问题讨论】:

  • 我不知道您的问题的答案,但我建议您将 C# DLL 导入您的项目。这是一个例子。 codeproject.com/Tips/695387/… 这样您就可以从您的 C++ 项目中访问酷炫的 c#/ .net 方法
  • 向 C++ 添加可恢复函数是 ISO proposal。它们通常以蜗牛的速度移动,您至少必须等到 C++17。如果您想使用experimental headers,那么您今天就可以使用 VS2015。
  • 您为什么要这样做?我想不出一个令人信服的理由来阻止 UI 线程。如果您需要序列化操作,请使用continuation task。 @ProblemSlover:如果您只有一把锤子,那么每个问题都开始看起来像钉子。现在你有两个问题。
  • @IInspectable 感谢您的回答。事实上,我们的目标是将现有项目交付给 WinRT,该项目有太多遗留代码。
  • 例如,如果有API使用win32 api保存文件,而其他代码是独立于paltform的,那么通过WinRT重新构建API并保持其他代码不变的成本最低。不幸的是,WinRT async apis 不能满足我们,这就是我问这个问题的原因。

标签: windows-runtime uwp c++-cx


【解决方案1】:

编辑:从 VS 2015 Update 2 开始,VC++ 支持 co_await 用于生产用途(尽管它处于特殊标志下,因为它尚未标准化)。你可以在this MSDN video看到更多。

请注意,C# 中的await 不是同步调用;不涉及阻塞。它只是给人一种顺序执行的错觉。

C++ 明确阻止在 UI 线程上调用 get 以避免挂起 UI。

【讨论】:

  • 谢谢。我对c#不熟悉。听起来很神奇,然后我有一个测试。
  • 如你所说,如果在 UI 线程中等待,它不会被阻塞。你能告诉我等待期间 UI 线程在做什么吗?我怀疑它会返回事件循环并继续处理事件。保持逻辑顺序会不会有问题?例如,如果一个事件处理程序依赖于前一个的结果,它会使代码混乱吗?谢谢:)
  • 你说得对;它会一直运行事件循环,因此您需要通过禁用 UI 控件直到异步方法完成来保护您的代码免于重新进入(例如)。
  • 你的意思是C++的get和C#的await不一样吗? C++ 的 get 不能返回事件循环。这就是我们不能用 C++ 等待 UI 线程的原因吗?
  • 最终我得到了 C++ 的 __await 工作:)。它确实会挂起 UI,与 C# 的等待不同。谢谢!
【解决方案2】:

我终于找到了使用await的方法,但是它是有限的。

在 VS2015 中使用 await http://blogs.msdn.com/b/vcblog/archive/2014/11/12/resumable-functions-in-c.aspx

await 和 yield 是实验性的。如果您想使用它们,请记住它们仅在 x64 上受支持,并设置一些编译器选项:

  • 添加/等待
  • 禁用 /RTC
  • /ZI -> /Zi

【讨论】:

猜你喜欢
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2014-06-21
  • 2021-10-09
  • 2017-03-25
  • 2010-09-20
相关资源
最近更新 更多