title author date CreateTime categories
win10 uwp 非ui线程访问 ui
lindexi
2019-10-12 15:0:12 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

大家都知道,不可以在 其他线程访问 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
});

在 UWP 所有的继承依赖属性 DependencyObject 的类,都有 Dispatcher 属性

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

await 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 - 星期八再娶你 - 博客园

win10 uwp Window.Current.Dispatcher中Current为null

2019-10-12-win10-uwp-非ui线程访问-ui-的更多相关文章

  1. 跨线程访问UI控件时的Lambda表达式

    工作中经常会用到跨线程访问UI控件的情况,由于.net本身机制,是不允许在非UI线程访问UI控件的,实际上跨线程访问UI控件还是 将访问UI的操作交给UI线程来处理的, 利用Control.Invok ...

  2. 学习通过Thread+Handler实现非UI线程更新UI组件(转)

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  3. 学习通过Thread+Handler实现非UI线程更新UI组件

    [Android线程机制] 出于性能考虑,Android的UI操作并不是线程安全的,这就意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则 ...

  4. Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面

    Android应用的开发过程中需要把繁重的任务(IO,网络连接等)放到其他线程中异步执行,达到不阻塞UI的效果. 下面将由浅入深介绍Android进行异步处理的实现方法和系统底层的实现原理. 本文介绍 ...

  5. Android异步处理系列文章四篇之一使用Thread+Handler实现非UI线程更新UI界面

    目录: Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+L ...

  6. Winform非UI线程更新UI界面的各种方法小结

    我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在进行异步操作时,经常需要将异步执行的进度报告给用户,让用户知道任务的进度,不至于让用户误认为程序“死掉了”,特别是对 ...

  7. 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/xiashengwang/archive/2012/08/18/2645541.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控 ...

  8. WPF 非UI线程更新UI界面的各种方法小结

    转载:https://www.cnblogs.com/bdbw2012/articles/3777594.html 我们知道只有UI线程才能更新UI界面,其他线程访问UI控件被认为是非法的.但是我们在 ...

  9. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...

随机推荐

  1. oracle-Expdp/impdp命令

    建立逻辑路径 create or replace directory dumpdir as 'c:\'; grant read,write on directory dumpdir to scott; ...

  2. SDUT-2144_最小生成树

    数据结构实验之图论九:最小生成树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 有n个城市,其中有些城市之间可以修建公 ...

  3. srand函数

    srand函数是随机数发生器的初始化函数. 原型: void srand(unsigned seed); 用法:它需要提供一个种子,这个种子会对应一个随机数,如果使用相同的种子后面的rand()函数会 ...

  4. Linux下C 更改字符在终端的显示颜色

    使用\033[01;04;32;41m之类的配色方案在需要输出显示的文本之前,可以改变应用程序输出文本的颜色或者背景颜色. 比如: #include <stdio.h> int main( ...

  5. mysql 使用concat模糊查询

    如果这三个字段中有值为NULL,则返回的也是NULL,那么这一条记录可能就会被错过,使用IFNULL进行判断 SELECT * FROM `magazine` WHERE CONCAT(IFNULL( ...

  6. 学生信息管理系统之【修改信息窗口】 标签: 数据库vb 2014-06-13 21:23 1167人阅读 评论(15)

    自从开始敲学生信息管理,就发现有几个窗口从来木有成功打开过,它们是(修改学籍信息)(修改成绩信息)和(修改课程信息)窗口,这几个窗口每次想打开的时候都会弹出"实时错误:3021"这 ...

  7. 条件变量用例--解锁与signal的顺序问题

    我们知道,当调用signal/broadcast唤醒等待条件变量的其他线程时,既可以在加锁的情况下调用signal/broadcast,也可以在解锁的情况下调用. 那么,到底哪种情况更好呢?man手册 ...

  8. Gym-101623H_High Score

    题意:t组数据,每组数据有abcd四个数,其中d可以加到abc任意一个数上(d可以拆分),求公式a^2 + b^2 + c^2 + 7 * min(a,b,c)的最大值. 题解:首先明确一点,平方的增 ...

  9. Mysql——ERROR 1045 (28000): Access denied for user 'root'@'localhost'

    1.修改my.ini,最后一行添加  skip-grant-tables  ,保存关闭.(win10默认安装路径:C:\ProgramData\MySQL\MySQL Server 5.7) 2.重启 ...

  10. oracle函数 dbtimezone

    [功能]:返回时区 [参数]:没有参数,没有括号 [返回]:字符型 [示例]select dbtimezone from dual;