我试图了解线程在UWP中是如何工作的。
据我所知:
1)每个应用程序窗口都有一个UI线程。和许多工作者(或背景)线程。
2) UI元素只能通过UI线程访问。可以在后台线程中执行所有内存密集型的计算,只需将值分配给UI线程,以保持UI响应性。
为此,使用了CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(()=>方法)。
3)要检查线程是UI线程还是非UI线程,可以使用CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess。(如前面提到的here )。
但,
当我尝试使用CoreApplication.MainView.CoreWindow.Dispatcher.HasThreadAccess,时,它在大多数情况下返回True。
此外,在线程窗口中调试时,在“类别”列下有一个主线程,它只有一个线程,如下所示:

编辑:我的同事说,如果名称是Worker ,那么它的非GUI线程。
当我使用Observable.Start(来自System.Reactive)而不是Task.Run时,我得到了两个这样的实例(没有名称),这违背了每个窗口的一个UI线程的概念:(

问题是,
如何从列表中找到One Ui线程?or..Is主线程UI线程?(但其托管ID为0)
任何关于上述问题的线索都会很有帮助!
发布于 2019-02-04 00:55:40
在(2)中,使用dispatcher运行异步不会创建工作人员(线程池)任务。它在dispatcher上下文上创建一个新任务,这个上下文只包含UI线程。
注意,异步和线程是不同的概念。dispatcher运行异步创建的任务是异步运行的,但运行在同一个线程上。这可能就是HasThreadAccess返回true的原因。
若要在工作线程(线程池)线程上创建任务,可以使用Task.Run。注意,线程池上下文有多个线程,这些线程可以分配给不同的处理器,因此两个任务可能同时运行。因此,通常需要一些锁定的公司(如SemaphoreSlim)。
sjb
https://stackoverflow.com/questions/42432046
复制相似问题