首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在UWP中找到UI线程

如何在UWP中找到UI线程
EN

Stack Overflow用户
提问于 2017-02-24 06:17:48
回答 1查看 1.9K关注 0票数 10

我试图了解线程在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)

任何关于上述问题的线索都会很有帮助!

EN

回答 1

Stack Overflow用户

发布于 2019-02-04 00:55:40

在(2)中,使用dispatcher运行异步不会创建工作人员(线程池)任务。它在dispatcher上下文上创建一个新任务,这个上下文只包含UI线程。

注意,异步和线程是不同的概念。dispatcher运行异步创建的任务是异步运行的,但运行在同一个线程上。这可能就是HasThreadAccess返回true的原因。

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

sjb

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42432046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档