wpf线程中更新UI的4种方式

devtools/2024/9/23 14:29:58/

        在wpf中,更新UI上面的数据,那是必经之路,搞不好,就是死锁,或者没反应,很多时候,都是嵌套的非常深导致的。但是更新UI的方式,有很多的种,不同的方式,表示的意思不一样,但是眼睛看到的,似乎是一回事。

首先我们创建一个简单的wpf程序

业务就是,一直点击确定,然后更新数据即可,比较简单,通过简单的案例来了解一个wpf中更新UI的4种方法。 

第一种:

点击确定后,界面先变化Hello WPF11,再变化Hello WPF12,并且界面可以任意拖动不卡。

这个方法是全局性质的。

using System.Windows;namespace WpfApp6Demo
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private async void btnLogin_Click(object sender, RoutedEventArgs e){await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF11");});await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF12");});}private void UpdateTextBlock(string text){System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>{txtUsername.Text = text;}));}}
}

第二种:

点击确定后,和前面的效果是一样的。

这个方法是当前界面性质的。

using System.Windows;namespace WpfApp6Demo
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private async void btnLogin_Click(object sender, RoutedEventArgs e){await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF11");});await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF12");});}private void UpdateTextBlock(string text){//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>//{//    txtUsername.Text = text;//}));this.Dispatcher.Invoke(new Action(() =>{txtUsername.Text = text;}));}}
}

第三种:

点击确定后,和前面的效果是一样的。

这个方法是当前控件性质的。

using System.Windows;namespace WpfApp6Demo
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private async void btnLogin_Click(object sender, RoutedEventArgs e){await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF11");});await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF12");});}private void UpdateTextBlock(string text){//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>//{//    txtUsername.Text = text;//}));//this.Dispatcher.Invoke(new Action(() =>// {//     txtUsername.Text = text;// }));txtUsername.Dispatcher.Invoke(new Action(() =>{txtUsername.Text = text;}));}}
}

第四种: 

点击确定后,和前面的效果是一样的。

这个方法是当前控件性质的,但是还对当前控件进行是否有访问权限进行了判断。

using System.Windows;namespace WpfApp6Demo
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private async void btnLogin_Click(object sender, RoutedEventArgs e){await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF11");});await Task.Run(() =>{// 耗时操作Thread.Sleep(2000);UpdateTextBlock("Hello WPF12");});}private void UpdateTextBlock(string text){//System.Windows.Application.Current.Dispatcher.Invoke(new Action(() =>//{//    txtUsername.Text = text;//}));//this.Dispatcher.Invoke(new Action(() =>// {//     txtUsername.Text = text;// }));//txtUsername.Dispatcher.Invoke(new Action(() =>//{//    txtUsername.Text = text;//}));if (!txtUsername.Dispatcher.CheckAccess()){txtUsername.Dispatcher.Invoke(new Action<string>(UpdateTextBlock), text);}else{txtUsername.Text = text;}}}
}

以上都是以同步Invoke的方式进行调用的,异步的话使用BeginInvoke。 

总结:通过案例,可以了解到,上面4种方式,对于此案例来说都可以达到最终的效果,但是那一种效果最好,并没有体现出来。博主认为:第三种最好,原因是从这个需求上考虑的,因为需求需要更新的就是txtUsername上面的数据,那么直接作用于它,对于资源的耗损,将是最少得。可能有人认为第四种方式最好,进行了线程判断,似乎更加的安全,那么您认为呢???

本文来源:

wpf线程中更新UI的4种方式-CSDN博客


http://www.ppmy.cn/devtools/32672.html

相关文章

Apache kylin面试题50道题及参考答案(2万字长文)

目录 什么是Apache Kylin,它主要用于解决什么问题? 解释OLAP和Kylin是如何关联的。

022、Python+fastapi,第一个Python项目走向第22步:ubuntu 24.04 docker 安装mysql8集群、redis集群(三)

这次来安装mysql8了&#xff0c;以前安装不是docker安装&#xff0c;这个我也是第一次&#xff0c;人人都有第一次嚒 前言 前面的redis安装还是花了点时间的&#xff0c;主要是网上教程&#xff0c;各有各的好&#xff0c;大家千万别取其长处&#xff0c;个人觉得这个环境影响…

JAVA系列 小白入门参考资料 接口

目录 接口 接口的概念 语法 接口使用 接口实现用例 接口特性 实现多个接口和实现用例 接口间的继承 接口 接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的 USB 口&#xff0c;电源插座等。 电脑的 USB 口上&am…

【二】电力系统规约IEC 104详解

电力系统规约IEC 104详解 概述 很早就准备梳理出一下电力系统规约系列的文章&#xff0c;因为自己在实践过程中发现这方面太难找了&#xff0c;网上的资料也都比较陈旧。我接触和使用IEC系列规约也有一段时间了&#xff0c;本着总结和分享的想法&#xff0c;我想推出这系列的文…

Python词频统计

在Python中进行词频统计是一项基础的文本分析任务&#xff0c;通常涉及以下步骤&#xff1a; 文本预处理&#xff1a;包括去除标点符号、转换为小写、去除停用词等。分词&#xff1a;将文本分割成单词或词汇。统计词频&#xff1a;对分词后的结果进行计数。 以下是一个简单的…

RabbitMQ之延迟队列

为什么要有延迟队列&#xff1f; 延迟消息就是指当消息被发送以后&#xff0c;并不想让消费者立即拿到消息&#xff0c;而是等待指定时间后&#xff0c;消费者才拿到这个消息进行消费。 使用场景&#xff1a; 短信通知&#xff1a;下单成功后60s之后给用户发送短信通知。 失败重…

GNU Radio创建FFT、IFFT C++ OOT块

文章目录 前言一、GNU Radio官方FFT弊端二、创建自定义的 C OOT 块1、创建 OOT 模块2、创建 OOT 块3、修改 C 和 CMAKE 文件4、编译及安装 OOT 块 三、测试1、grc 图2、运行结果①、时域波形对比②、频谱图对比 四、资源自取 前言 GNU Radio 自带的 FFT 模块使用起来不是很方便…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…