如何在UWP中查找UI线程

Hig*_*row 9 c# multithreading asynchronous system.reactive uwp

我试图了解线程在UWP中的工作原理.

我的知识是:

1)每个应用程序窗口都有一个UI线程.和许多工人(或背景)线程.

2)UI元素只能通过UI线程访问.可以在后台线程中执行所有内存密集型计算,只需将值分配给UI线程以保持UI响应.

为此,使用 CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(()=>方法).

3)要检查线程是UI线程还是非UI线程,可以使用CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess.(如此处所述)

但,

当我尝试使用CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess时,它在大多数情况下返回True.(甚至来自工作线程类别)

此外,在线程窗口中调试时,在类别列下有一个主线程,它只有一个线程,如下所示:

在此输入图像描述

编辑:我的同事说,如果名称是工作线程,那么它的非GUI线程.

当我使用Observable.Start(来自System.Reactive)而不是Task.Run时,我得到两个这样的实例(没有名字),这违反了一个UI线程每个窗口概念:(

在此输入图像描述

问题是,

如何从列表中找到One Ui线程?或..是主线程UI线程?(但其托管ID为0)

任何关于上述问题的信息都将对您有所帮助!

sjb*_*sjb 1

在(2)中的发帖中,使用调度程序Run Async不会创建worker(线程池)任务。它在调度程序上下文中创建一个新任务,该上下文是仅包含 UI 线程的上下文。

请注意,异步和线程是不同的概念。由调度程序 Run Async 创建的任务是异步运行的,但在同一线程上。这可能就是 HasThreadAccess 返回 true 的原因。

要在工作线程(线程池)上创建任务,可以使用 Task.Run。请注意,线程池上下文有多个线程,并且这些线程可以分配给不同的处理器,因此两个任务可能同时运行。因此,经常需要一些锁定机制(例如SemaphoreSlim)。

sjb