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)
任何关于上述问题的信息都将对您有所帮助!
在(2)中的发帖中,使用调度程序Run Async不会创建worker(线程池)任务。它在调度程序上下文中创建一个新任务,该上下文是仅包含 UI 线程的上下文。
请注意,异步和线程是不同的概念。由调度程序 Run Async 创建的任务是异步运行的,但在同一线程上。这可能就是 HasThreadAccess 返回 true 的原因。
要在工作线程(线程池)上创建任务,可以使用 Task.Run。请注意,线程池上下文有多个线程,并且这些线程可以分配给不同的处理器,因此两个任务可能同时运行。因此,经常需要一些锁定机制(例如SemaphoreSlim)。
sjb