C#中UI线程的切换与后台线程的使用

文章速览

  • UI线程切换
    • 示例
  • 后台线程使用
    • 示例
  • 两者对比
    • 适用场景
      • Application.Current.Dispatcher.Invoke
      • Task.Factory.StartNew
    • 执行同步性
      • Application.Current.Dispatcher.Invoke
      • Task.Factory.StartNew

一个赞,专属于你的足迹!

UI线程切换

在WPF应用程序中,UI元素只能由创建其的线程(通常UI线程)进行访问和修改。当我们从非UI线程尝试访问UI元素时,就需要通过使用【Application.Current.Dispacher.Invoke】将操作切换到UI线程。

示例

假设有一个按钮点击事件,在后台线程中进行一些处理后需要更新 UI 文本框的内容:

private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 后台线程中处理数据string result = LongRunningOperation();// 使用 Dispatcher.Invoke 更新 UIApplication.Current.Dispatcher.Invoke(() =>{textBox.Text = result;});});
}
private string LongRunningOperation()
{// 模拟耗时操作Thread.Sleep(3000);return "Result";
}

后台线程使用

当进行计算密集型任务或者耗时的操作(如数据处理、网络请求等),可以使用 【Task.Factory.StartNew】启动一个新线程来完成。

此处可以结合着同步、异步、并发来思考。
相关文章:
同步、异步、并发的区别

示例

如果只需要进行后台计算而不需要更新 UI:

private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 在后台线程中执行计算任务int result = CalculateResult();// 这里没有更新 UI 的操作});
}
private int CalculateResult()
{// 模拟计算任务Thread.Sleep(2000);return 42;
}

两者对比

适用场景

Application.Current.Dispatcher.Invoke

主要用于需要更新 UI 的情况。
例如,在多线程程序中,当一个后台线程完成了数据的计算或获取,需要将结果显示在 UI 上(如更新文本框、列表框等控件的内容),此时就需要使用 Application.Current.Dispatcher.Invoke 将更新 UI 的代码放到 UI 线程来执行。

Task.Factory.StartNew

更适用于需要并行处理任务的场景。比如,同时处理多个文件的读写操作,或者同时进行多个网络请求,或者执行一些复杂的计算任务,而这些任务不需要频繁地更新 UI。通过 Task.Factory.StartNew 可以有效地利用多核 CPU 的性能,提高程序的执行效率。

执行同步性

Application.Current.Dispatcher.Invoke

Invoke 方法是同步执行的。当调用 Invoke 时,调用线程(通常是后台线程)会一直等待直到 UI 线程完成指定的操作后才会继续执行后续的代码。这意味着如果 Invoke 中的操作比较耗时,调用线程会被阻塞。

Task.Factory.StartNew

一般用于启动异步任务。
任务一旦启动,它会在后台线程池中独立运行,调用线程(一般是 UI 线程)不会等待任务完成就继续执行后续代码。不过,可以通过一些同步机制(如 Wait、Result 等)来等待任务完成,但这不是默认的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/81376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【HTML】个人博客页面

目录 页面视图​编辑 页面代码 解释&#xff1a; HTML (<body>): 使用了更加语义化的HTML5标签&#xff0c;例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹&#xff0c;结构清晰。添加了分页导航。使用了Font…

第J1周:ResNet-50算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 我的环境 语言环境:Python3.8 编译器:Jupyter Lab 深度学习环境:Pytorchtorch1.12.1cu113 torchvision0.13.1cu113 一、准备工作 二、导入数据 三、划分数据…

养生:健康生活的极简攻略

在追求高效生活的当下&#xff0c;养生也能化繁为简。通过饮食、运动、睡眠与心态的精准调节&#xff0c;就能轻松为健康续航。 饮食上&#xff0c;遵循 “均衡、节制” 原则。早餐用一杯热豆浆搭配水煮蛋和半个苹果&#xff0c;唤醒肠胃活力&#xff1b;午餐以糙米饭为主食&am…

迁移 Visual Studio Code 设置和扩展到 VSCodium

本文同步发布在个人博客 迁移 Visual Studio Code 设置和扩展到 VSCodium - 萑澈的寒舍https://hs.cnies.org/archives/vscodium-migrateVisual Studio Code&#xff08;以下简称 VS Code&#xff09;无疑是当下最常用的代码编辑器。尽管微软的 VS Code 源代码采用 MIT 协议开…

力扣654题:最大二叉树(递归)

小学生一枚&#xff0c;自学信奥中&#xff0c;没参加培训机构&#xff0c;所以命名不规范、代码不优美是在所难免的&#xff0c;欢迎指正。 标签&#xff1a; 二叉树、递归 语言&#xff1a; C 题目&#xff1a; 给定一个不重复的整数数组 nums 。最大二叉树可以用下面的算…

离散制造企业WMS+MES+QMS+条码管理系统高保真原型全解析

在离散型制造企业的生产过程中&#xff0c;库存管理混乱、生产进度不透明、质检流程繁琐等问题常常成为制约企业发展的瓶颈。为了帮助企业实现全流程数字化管控&#xff0c;我们精心打造了一款基于离散型制造企业&#xff08;涵盖单件生产、批量生产、混合生产模式&#xff09;…

Linux操作系统--进程间通信(system V共享内存)

目录 1.system V共享内存 2.共享内存数据结构 3.共享内存函数 4.实例代码&#xff1a; 1.system V共享内存 共享内存区是最快的IPC(进程间通信)形式。一旦这样的内存映射到共享它的进程地址空间&#xff0c;这些进程间数据传递不再涉及到内核&#xff0c;换句话说是进程不再…

【C++】类与对象

目录 1、类的定义 2、类的访问限定符及封装 3、类的实例化 4、类和对象的大小 5、this 指针 6、类的六个默认成员函数 构造函数 析构函数 拷贝构造函数 赋值重载函数 取地址运算符的重载函数 7、运算符重载 8、const 成员函数 9、 static 成员 10、友元 11、…

现代简约中式通用,民国画报风,中国风PPT模版8套一组分享

中国风PPT模版分享&#xff1a;中国风PPT模版分享https://pan.quark.cn/s/abbf75507c5f 第1套PPT模版&#xff1a;棕色调中式窗棂封面&#xff0c;水墨山水背景配白梅与灯笼流苏&#xff0c;适用于教学课件目录设计&#xff0c;展现浓郁的书卷气息。 第2套PPT模版&#xff1a;米…

django扩展练习记录

一、Django 中使用 django-apscheduler 实现定时任务 可以方便地管理周期性任务&#xff08;如每天清理缓存、定时发送邮件等&#xff09; 1. 安装 pip install django-apscheduler -i https://pypi.tuna.tsinghua.edu.cn/simple #0.7.02.添加到应用&#xff0c;python m…

Guided Filtering相关记录

一、背景介绍 以前折腾保边滤波时候&#xff0c;刷了一些Guided Filtering相关资料。这里主要是对它们做个算法效果复现和资料简单整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是为了改善双边滤波做保边平滑滤波器时候的梯度翻转伪影…

知识图谱系列(2):知识图谱的技术架构与组成要素

1. 引言 知识图谱作为一种强大的知识表示和组织方式,已经在搜索引擎、推荐系统、智能问答等多个领域展现出巨大的价值。在之前的上一篇文章中,我们介绍了知识图谱的基础概念与发展历程,了解了知识图谱的定义、核心特征、发展历史以及在AI发展中的地位与作用。 要深入理解和…

操作系统|| 虚拟内存页置换算法

题目 写一个程序来实现 FIFO 和 LRU 页置换算法。首先&#xff0c;产生一个随机的页面引用序列&#xff0c;页面数从 0~9。将这个序列应用到每个算法并记录发生的页错误的次数。实现这个算法时要将页帧的数量设为可变。假设使用请求调页。可以参考所示的抽象类。 抽象类&…

开发与AI融合的Windsurf编辑器

Windsurf编辑器是开发人员和人工智能真正融合在一起的地方&#xff0c;提供了一种感觉像文字魔术的编码体验。 手册&#xff1a;Windsurf - Getting Started 下载链接&#xff1a;Download Windsurf Editor for Windows | Windsurf (formerly Codeium) 下载安装 从上面的下载…

【Java】网络编程(Socket)

网络编程 Socket 我们开发的网络应用程序位于应用层&#xff0c;TCP和UDP属于传输层协议&#xff0c;在应用层如何使用传输层的服务呢&#xff1f;在应用层和传输层之间&#xff0c;则使用套接字Socket来进行分离 套接字就像是传输层为应用层开的一个小口&#xff0c;应用程…

【教程】Docker方式本地部署Overleaf

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 背景说明 下载仓库 初始化配置 修改监听IP和端口 自定义网站名称 修改数据存放位置 更换Docker源 更换Docker存储位置 启动Overleaf 创…

根据用户ID获取所有子节点数据或是上级直属节点数据

一、根据用户ID获取所有子节点&#xff0c;通过存储过程来实现 CREATE DEFINERcrmeb% PROCEDURE proc_get_user_all_children( IN rootUid INTEGER, -- 要查询的根用户ID IN includeSelf BOOLEAN -- 是否包含自身(1包含,0不包含) ) BEGIN -- 声明变…

计算机组成原理——数据的表示

2.1数据的表示 整理自Beokayy_ 1.进制转换 十六进制与二进制的转换 一位十六进制等于四位二进制 四位二进制等于一位十六进制 0x173A4C0001 0111 0011 1010 0100 1100 十六进制与十进制的转换 十六转十&#xff1a;每一位数字乘以相应的16的幂再相加 十转十六&#xff1a…

基于MATLAB-GUI图形界面的数字图像处理

基于MATLAB GUI的数字图像处理系统实现方案&#xff0c;包含常见图像处理功能。代码分为两部分&#xff1a;GUI界面设计和回调函数实现。 %% 第一部分&#xff1a;创建GUI界面 (使用GUIDE) % 1. 打开GUIDE: guide % 2. 创建新GUI&#xff0c;添加以下控件&#xff1a; % - …

从裸机开发到实时操作系统:FreeRTOS详解与实战指南

从裸机开发到实时操作系统&#xff1a;FreeRTOS详解与实战指南 本文将带你从零开始&#xff0c;深入理解嵌入式系统中的裸机开发与实时操作系统&#xff0c;以FreeRTOS为例&#xff0c;全面剖析其核心概念、工作原理及应用场景。无论你是嵌入式新手还是希望提升技能的开发者&am…