[Windows翻译]在C++/WinRT中创建一个非敏捷的委托,第3部分:其他的情况以及为什么它们不有趣?

175 阅读2分钟

原文地址:devblogs.microsoft.com/oldnewthing…

原文作者:devblogs.microsoft.com/oldnewthing…

发布时间:2020年4月8日

我们一直在研究非敏捷委托的一种特殊情况,即在后台线程上调用委托,并希望在UI线程上同步执行。那么其他情况呢?

对,那它们呢?我们写出一个表来。

处理在\发起于后台线程UI线程
后台线程已经有了没有意义
UI线程resume_synchronous已经有了
其他UI线程resume_synchronousresume_synchronous

其中有两个箱子上标着已经有了。这些情况是指事件是在你想处理的同一个公寓中提出的,在这种情况下,一切都很好,没有必要玩什么公寓切换游戏。

其中有两个盒子的标签是 resume_synchronous。在这些情况下,你想在一个UI线程上同步运行处理程序,而这个线程不是你的处理程序被调用的线程。在这些情况下,你可以使用我们上次讨论的 resume_synchronous 函数。当然,由于你是在一个UI线程上运行,你不应该执行长时间的阻塞操作。如果你在右下角,这一点尤其正确,因为当你的事件处理程序运行时,你要挟两个UI线程。

这就剩下最后一个方框了,标注为Makes no sense。

这个框是没有意义的。

这个方框代表了这样一种情况:事件是在一个UI线程上引发的,但你想在一个后台线程上同步处理它。为什么要这样做呢?

通常移到后台线程的原因是为了让你在不影响UI线程响应速度的情况下执行长期运行的操作。但这在这里对我们没有帮助,因为这个表是要在另一个公寓里同步运行代码,所以在后台线程工作的时候,UI线程要保持无响应。切换到后台线程也没有任何作用。你还不如直接在UI线程上做。

请记住,整个讨论是在同步运行处理程序的情况下进行的。如果你可以异步运行处理程序,或许是在延迟的协助下,那么你就应该这样做。

下一次我们将以不同的方式将这个讨论与C++/WinRT联系起来,从而结束这个讨论。


通过www.DeepL.com/Translator (免费版)翻译