每个WinRT / Windows Core线程都有一个Dispatcher吗?

时间:2016-08-04 05:04:40

标签: windows-runtime windows-10-universal windows-10-iot-core winrt-async

我们提供的库需要在自己的自定义线程上运行代码。完成后,我希望这些线程通过DispatcherSystem.Windows.Threading.Dispatcher)调用回调(事件处理程序)。库用户应使用Dispatcher将事件处理分派给。

我们可以简单地在CoreApplication.MainView.CoreWindow.Dispatcher上发送,但并非所有程序(例如Windows 10 IoT核心应用程序)都提供UI,因此它们没有主窗口。

用户是否可以简单地引用System.Windows.Threading.Dispatcher.CurrentDispatcher来获取他的帖子Dispatcher?或者所有线程都不能拥有Dispatcher?

修改:此问题的更多背景信息。希望这使问题更容易掌握:https://github.com/getsenic/nuimo-windows/issues/2

2 个答案:

答案 0 :(得分:1)

首先,我不确定你应该在UI线程上执行事件处理程序,因为只有客户端知道他是否需要访问UI元素。

第二,在调用matrix = [ ['A', 'B', 'C', 'D'], ['E', 'F', 'G', 'H'], ['I', 'J', 'K', 'L'], ['M', 'N', 'O', 'P'] ] 属性之前,您可以检查 node = 'K' # Input # Get the matrix dimension n = len(matrix) m = len(matrix[0]) # Assume there is exactly one matching node for i in xrange(n): for j in xrange(m): if matrix[i][j] == node: x, y = i, j (我不能确定它会起作用,因为目前我没有设备来测试它)。

而且你也可以用另一种方式解决这个问题:在你对象的构造函数中保存执行线程的SynchronizationContext然后用它来引发事件。如果您的对象从UI线程实例化(在大多数情况下它是真的),它将起作用。这样你就可以完全拒绝Dispatcher。

CoreApplication.MainView

答案 1 :(得分:0)

  

或者所有线程都不能有Dispatcher?

Dispatcher线程始终与UI线程绑定。 IoT无头模式应用程序没有UI,因此它没有Dispatcher线程。

  

用户是否可以简单地引用System.Windows.Threading.Dispatcher.CurrentDispatcher来获取其线程的Dispatcher

System.Windows.Threading.Dispatcher.CurrentDispatcher仅在旧版.NET平台中受支持。正如您所指出的,UWP替代方案是CoreApplication.MainView.CoreWindow.Dispatcher。

如果你想在Headless(没有GUI)模式下进行异步回调,你可以参考任务并行库(TPL),ContinueWhenAll ContinueWhenAny等API ......可能很适合你的需要。请参阅https://msdn.microsoft.com/en-us/library/system.threading.tasks.taskfactory.aspx