WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync
原文地址:https://blog.csdn.net/niuge8905/article/details/81117989
深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)https://blog.csdn.net/WPwalter/article/details/78093917
这里主要用上几个实例。总结一下:
1.BeginInvoke和InvokeAsync原理一致,可取得一致的结果,用InvokeAsync会更实用方便,因为可以直接用上Action和Fun方法。
2.Invoke会阻塞线程,直到Invoke里的代码完成,InvokeAsync和BeginInvoke会直接运行后面的代码。
来看一个简单的实例:
private void btnExecute_Click(object sender, RoutedEventArgs e)
{
Thread th = new Thread(DoSomething);
th.Start(); result.Content = "1";
this.Dispatcher.Invoke(() => { result.Content += "2"; Thread.Sleep(2000); });
result.Content += "3";
} private void DoSomething()
{
for (int i = 0; i < 10; i++)
{
this.Dispatcher.Invoke(() => { result.Content += i.ToString(); });
Thread.Sleep(1000);
}
}

修改按钮点击的 Invoke 为 InvokeAsync, 代码如下:
private void btnExecute_Click(object sender, RoutedEventArgs e)
{
Thread th = new Thread(DoSomething);
th.Start(); result.Content = "1";
this.Dispatcher.InvokeAsync(() => { result.Content += "2"; Thread.Sleep(2000); });
result.Content += "3";
} private void DoSomething()
{
for (int i = 0; i < 10; i++)
{
this.Dispatcher.Invoke(() => { result.Content += i.ToString(); });
Thread.Sleep(1000);
}
}
执行结果:

InvokeAsync 不会等待工作线程结束,直接执行后面的代码,所以先运行了 result.Content += "3"
修改线程函数中的 Invoke 为 InvokeAsync,代码如下:
private void btnExecute_Click(object sender, RoutedEventArgs e)
{
Thread th = new Thread(DoSomething);
th.Start(); result.Content = "1";
this.Dispatcher.InvokeAsync(() => { result.Content += "2"; Thread.Sleep(2000); });
result.Content += "3";
} private void DoSomething()
{
for (int i = 0; i < 10; i++)
{
this.Dispatcher.InvokeAsync(() => { result.Content += i.ToString(); });
Thread.Sleep(1000);
}
}
执行结果如下:

WPF的Dispatcher类里的BeginInvoke,Invoke,InvokeAsync的更多相关文章
- 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)
深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher.跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它.Dispatcher.Invoke.Dispa ...
- WPF 线程 Dispatcher
WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线 ...
- C# Note28: Dispatcher类
在项目中也是经常用到: 刚见到它时,你会想:为什么不直接使用System.Windows命名空间下的MessageBox类,何必要这么麻烦?(认真分析看它做了什么,具体原因下面解释) 主要介绍的方法: ...
- WPF基础:Dispatcher介绍
Disaptcher作用 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负 ...
- Thinkphp源码分析系列(四)–Dispatcher类
下面我们来分析一下Thinkphp中的url解析和路由调度类.此类主要功能是 // +--------------------------------------------------------- ...
- 深入struts2.0(五)--Dispatcher类
1.1.1 serviceAction方法 在上个Filter方法中我们会看到例如以下代码: this.execute.executeAction(request, response, m ...
- Debug模式,不能进入打断点的类,反而进入代理类里
有史以来,第一次,遇到这个问题, 设置好断点,Debug模式开启项目,,没有进入原来打好的断点类,反而,进入的是和断点类相同名字(但是图标不同)的一个类里, 不能真正的调试,调试变得很麻烦, 解决方案 ...
- 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用
<?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...
- WPF的Application类
本节主要介绍一下Application类的部分功能,我们首先来看一下如何使用Application类来加载一个窗口: 我们首先创建一个控制台程序,并引入相关的dll,然后修改Main()方法. [ST ...
- 六,WPF的Application类
Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...
随机推荐
- 2024年值得推荐的6款 Vue 后台管理系统模板,开源且免费!
前言 在现今的软件开发领域,Vue.js凭借其高效.灵活和易于上手的特性,成为了前端开发的热门选择.对于需要快速搭建企业级后台管理系统的开发者而言,使用现成的Vue后台管理系统模板无疑是一个明智之举. ...
- a标签与Blob下载文件的区别和获取文件下载进度
文件下载的几种方式. 大家都做过文件下载,无非就是通过a标签给定一个href. 用户点击下载按钮. 或者使用Blob的方式进行下载. 这两种是很常见的,也是我们平时做使用最多的方式. 那么我们知道这2 ...
- OpenLens 6.3.0 无法查案日志和进入 Pod Shell 解决方法
原因 OpenLens 6.3.0开始移除了Pod的查看日志和进入Pod Shell按钮,无法查看日志和进入Pod操作. 解决办法 OpenLens 6.3.0开始这两个功能以插件形式提供,需下载op ...
- Spring boot 2.0 之优雅停机
spring boot 框架在生产环境使用的有一段时间了,它"约定大于配置"的特性,体现了优雅流畅的开发过程,它的部署启动方式(java -jar xxx.jar)也很优雅.但是我 ...
- Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\opencv-4.1.0\modules\calib3d\src\calibration.cpp, line 3691
报错信息: Error: Assertion failed (nimages > 0) in cv::calibrateCameraRO, file D:\opencv4\opencv\open ...
- 阿里云maven仓库地址的配置
两种配置方式: 1. maven 配置文件配置settings.xml中设置mirror节点 <mirror> <id>nexus-aliyun</id> < ...
- 开源轻量级IM框架MobileIMSDK的鸿蒙NEXT客户端库已发布
一.基本介绍 MobileIMSDK-鸿蒙端是一套基于鸿蒙Next(纯血鸿蒙)系统的IM即时通讯客户端库: 1)超轻量级(编译后库文件仅50KB).无任何第3方库依赖(开箱即用): 2)纯ArkTS编 ...
- 树莓派linux kernel 添加menuconfig菜单选项和编译
https://www.bilibili.com/video/av91990721?zwbcmrpi_defconfig 打开顶层目录下的 Makefile,搜索 %config 找到如下内容: # ...
- vue基础4
Q:1.动画的使用方法以及动画库的使用方式 2.vue中的指令有哪些? 3.vue中生命周期钩子函数有哪些?分别代表什么含义? 4.filter的语法是什么? 5.computed的特点是什么? 6. ...
- ESP8266 wifi模块+CH340烧录板安装使用运行教程
硬件准备 ESP8266-01S 模块 USB转TTL烧录板(CH340) LED灯(建议使用3.3V LED) 220Ω电阻(LED限流) 面包板和跳线若干 我的是这样的不用接线,其他的参考 ESP ...