我想了解在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,它在大多数情况下,返回真。(即使从工作线程类别)
此外,虽然在调试线程窗口,在类别列有它只有一个线程,如下所示主线程:
编辑:我的同事说,如果名称是工作线程则其非GUI线程。
当我使用Observable.Start(从System.Reactive),而不是Task.Run,我得到两个这样的情况下(没有名称),这颠覆一个UI线程每个窗口概念:(
问题是,
我怎么能找到从列表中的一个UI线程? or..Is主线程UI线程?(但其管理的ID为0)
对上述问题的任何信息将是非常有帮助!
(2)在张贴,使用调度运行异步不创建工作(线程池)的任务。它创建的调度上下文,它是只包含UI线程上下文的新课题。
需要注意的是异步和线程是不同的概念。通过调度运行异步创建任务异步,但在同一个线程中运行。这可能是为什么HasThreadAccess被返回true。
要创建一个工作者(线程池)线程任务,你可以使用Task.Run。注意线程池的上下文有多个线程,这些可以被分配到不同的处理器,所以它可能是两个任务可以在同一时间运行。因此,锁定一些公司(如SemaphoreSlim)往往需要。
SJB