UWP 在非UI线程中更新UI

Posted hupo376787

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UWP 在非UI线程中更新UI相关的知识,希望对你有一定的参考价值。

大家都知道,不可以在 其他线程访问 UI 线程,访问 UI 线程包括给 依赖属性设置值、读取依赖属性、调用方法(如果方法里面修改了依赖属性)等。一旦访问UI线程,那么就会报错,为了解决这个问题,需要使用本文的方法,让后台线程访问 UI 线程。

本文提供三个方法可以让其他线程访问 UI 线程

第一个方法是比较不推荐使用的,可能出现 win10 uwp Window.Current.Dispatcher中Current为null

await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.High,
() =>
{
     //需要访问 ui 的代码
});

 

请注意,这里使用了 CoreDispatcherPriority ,表示优先级,请不要在这里使用 High ,一般都是使用比较低的优先

为何不设置为 High ,参见 CoreDispatcherPriority

那么比较推荐的一个方法是在一个用户控件或者Page之类的,如果在里面使用了异步线程需要访问 ui 的属性,那么可以使用下面代码

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => 
{
      //UI code here
});

 

如果是写在其他类,没有 Dispatcher ,那么可以使用下面的代码

await Windows.ApplicationModel.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => 
{ 
    //代码 
}); 

 


上面两种方法都写在堆栈网 https://stackoverflow.com/a/38175976/6116637

https://stackoverflow.com/questions/7401538/simple-example-of-dispatcherhelper

https://stackoverflow.com/questions/38149767/uwp-update-ui-from-task

 

以上是关于UWP 在非UI线程中更新UI的主要内容,如果未能解决你的问题,请参考以下文章

为何invalidate()不可以直接在UI线程中调用

为啥loop之后就可以子线程更新ui

在非 UI 线程中做一些 Android UI 的事情

WinForm中在非UI线程更改控件值的办法

关于message的内存优化

使用 DirectX11 更新非 UI 线程中的顶点缓冲区