【发布时间】:2016-08-04 05:04:40
【问题描述】:
我们提供了一个需要在自己的自定义线程上运行代码的库。完成后,我希望这些线程通过Dispatcher (System.Windows.Threading.Dispatcher) 调用回调(事件处理程序)。库用户应使用 Dispatcher 将事件处理分派到。
我们可以简单地始终在 CoreApplication.MainView.CoreWindow.Dispatcher 上进行调度,但并非所有程序(例如 Windows 10 IoT Core 应用程序)都提供 UI,因此它们缺少主窗口。
用户可以简单地引用System.Windows.Threading.Dispatcher.CurrentDispatcher 来获取他的线程的Dispatcher 吗?或者不是所有线程都有 Dispatcher?
编辑:这里有更多关于这个问题的背景信息。希望它能让问题更容易理解:https://github.com/getsenic/nuimo-windows/issues/2
【问题讨论】:
-
为什么要在 UI 线程上执行事件处理程序?当某些对象在后台(非 UI)线程上引发事件时,这是相当常见的情况。如果您的库的用户需要访问事件处理程序中的 UI 元素,他必须使用 Dispatcher 来处理此事件。
-
WPF 的行为相当不直观,给很多程序员带来了麻烦,这里有很多关于它的问题。 WinRT 没有重复那个错误,你只能从一个窗口中获取一个调度程序。这是合乎逻辑的方法,窗口只能在由具有调度循环的线程创建时才能工作,如果没有该循环,它就会像门钉一样死掉。如果您没有窗口,那么您也不再需要在特定线程上运行代码。
-
有一种方法可以在 UI 线程上引发事件。但要求您的对象是从 UI 线程创建/初始化的。是你的情况吗?我的意思是它只在从 UI 线程创建对象的情况下才有效。
-
或者例如,您可以在订阅的同一线程上引发事件处理程序,但这不是一个简单的解决方案。
-
我已更新问题以提供更多背景信息。
标签: windows-runtime windows-10-universal windows-10-iot-core winrt-async