【问题标题】:WinRT/C++ What is apartment_context actually?WinRT/C++ 什么是公寓上下文?
【发布时间】:2022-01-19 01:10:46
【问题描述】:

我所知道的是apartment_context是用来捕获UI Thread并在后台ThreadPool时返回UI Thread的。

那么,apartment_context 实际上在 WinRT/C++ 中是什么?以及如何正确正确地使用它?那么,这个对象是不是只能捕获 UI Thread 呢?

最后,与resume_foreground()CoreDispatcher::RunAsync()相比,使用apartment_context的优缺点是什么?

谢谢

【问题讨论】:

  • 你可以看看这个文档:Programming with thread affinity in mind。它包含有关如何使用apartment_context 的示例代码
  • @Roy Li - MSFT 我已经阅读了那些网站和类似的网站,但我仍然不太明白网上给出的解释。看来我需要的是一些使用apartment_context 的例子,这很复杂,而且在各种条件下。

标签: c++-winrt winrt-async


【解决方案1】:

一个winrt::apartment_context

在协程中捕获线程上下文,以便以后可以恢复。你实例化一个 winrt::apartment_context 值,然后你 co_await 它。

换句话说,它允许客户端代码存储有关当前线程单元的信息,切换到另一个单元,然后返回到它。它可以在任何线程上构建,而不仅仅是 UI 线程。但是,由于 UI 线程存在于特殊的1 ASTA(应用程序单线程单元)中,并且这些线程拥有的对象通常具有线程关联性,apartment_context 主要用于 UI 线程。

该实现包装了一个从对CoGetObjectContext 的调用中捕获的IContextCallback 接口。它的ContextCallback 方法

进入对象上下文,执行指定函数,返回。

这是相当先进的,几乎没有官方文档可用。幸运的是,Raymond Chen 发表了两篇博文2,3,对这一领域进行了足够详细的介绍。

相比之下,apartment_context 的接口没有暴露任何复杂性。它由一个默认构造函数和三个成员await_ready()await_suspend()await_resume() 组成,这三个成员使其成为coroutine awaiter4。因此,客户端代码执行的唯一操作是构造,co_await 它。例子和解释可以在Programming with thread affinity in mind找到。

至于优点和缺点,归根结底是了解正在发生的事情。虽然apartment_context 像宣传的那样工作,但重要的是要记住,它捕获了当前 上下文。因此,协程是否按预期工作成为调用者的责任。如果(部分)协程需要在 UI 线程上执行,则使用 resume_foreground 会更加健壮,并且可读性也更高。唯一的缺点是您需要访问调度程序。

最后,CoreDispatcher::RunAsync 最终做了同样的事情。除了,它是 Windows 运行时的一部分,而 resume_foreground() 是 C++/WinRT 库的一部分。我不知道有任何功能差异。


1What is so special about the Application STA?

2How do you get into a context via IContext­Callback::Context­allback?

3Using contexts to return to a COM apartment later

4C++ Coroutines: Understanding operator co_await

【讨论】:

  • 再次感谢。这真的很有帮助。
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
相关资源
最近更新 更多