原文地址: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的更多相关文章

  1. 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分)

    深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher.跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它.Dispatcher.Invoke.Dispa ...

  2. WPF 线程 Dispatcher

    WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线 ...

  3. C# Note28: Dispatcher类

    在项目中也是经常用到: 刚见到它时,你会想:为什么不直接使用System.Windows命名空间下的MessageBox类,何必要这么麻烦?(认真分析看它做了什么,具体原因下面解释) 主要介绍的方法: ...

  4. WPF基础:Dispatcher介绍

    Disaptcher作用 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是子线程.在WPF或WinForm应用程序中,主线程负 ...

  5. Thinkphp源码分析系列(四)–Dispatcher类

    下面我们来分析一下Thinkphp中的url解析和路由调度类.此类主要功能是 // +--------------------------------------------------------- ...

  6. 深入struts2.0(五)--Dispatcher类

    1.1.1       serviceAction方法 在上个Filter方法中我们会看到例如以下代码: this.execute.executeAction(request, response, m ...

  7. Debug模式,不能进入打断点的类,反而进入代理类里

    有史以来,第一次,遇到这个问题, 设置好断点,Debug模式开启项目,,没有进入原来打好的断点类,反而,进入的是和断点类相同名字(但是图标不同)的一个类里, 不能真正的调试,调试变得很麻烦, 解决方案 ...

  8. 1.__tostring()这个方法在类里可以直接输出对象。2.克隆对象的运用

    <?php //__tostring()这个方法在类里的用途 能够直接输出对象 class Ren { public $name; function Run() { echo "跑&q ...

  9. WPF的Application类

    本节主要介绍一下Application类的部分功能,我们首先来看一下如何使用Application类来加载一个窗口: 我们首先创建一个控制台程序,并引入相关的dll,然后修改Main()方法. [ST ...

  10. 六,WPF的Application类

    Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Ap ...

随机推荐

  1. AI让照片跳舞,人人都能是舞王!Swan下载介绍

    最近,兵马俑.马斯克以及各地网友跳科目三和网红舞的视频陆续在社交媒体和朋友圈刷屏,这些大约10秒左右的视频都不是真人出镜,均由大模型生成,这种低门槛的跳舞方式引发了网友的广泛体验,掀起了一波斗舞狂潮「 ...

  2. Android运行时请求权限封装

    @ 目录 1 介绍 2 测试用例设计 3 实现 4 用例测试 5 总结 本文目的:"借助透明Activity封装一个易于调用的权限请求模块" 1 介绍 Android权限的校验和申 ...

  3. Vue.js 事件绑定

    1.事件监听 v-on:eventName可以简写成@eventName 事件对象:在HTML中,事件参数为$event,但是即使不传递,在回调函数中也可以直接使用event读取 <div id ...

  4. window下cmd显示乱码

    前情 最近在维护一些老项目,本地开发环境跑不起来,需要根据cmd中的报错来解决一些环境问题 坑位 在解决环境错误的时候,cmd命令行日志打印出来的是一堆乱码,导致看不清具体是什么错误 Why? cmd ...

  5. 百度地图各种控件:地图平移缩放控件NavigationControl、地图类型控件MapTypeControl

    注:代码复制即可用,标色代码为主要代码 百度地图提供了如下控件: 1.Control:控件的抽象基类,所有控件均继承此类的方法.属性.通过此类您可实现自定义控件. 2.NavigationContro ...

  6. NoSQL 述评

    作为主库的 nosql 只有 CockroachDB.TiKV 以及 MongoDB(从4.0后事务似乎可用了),CockrouchDB 已经收费,另外 YugabyteDB 也可选,但大家的反馈都不 ...

  7. 【数据库】MySQL的一些基础知识

    ALTER TABLE 表名 DROP 属性名 删除数据表 DROP TABLE 数据库名.表名; 用户管理 创建用户 CREATE USER 'username'@'host' IDENTIFIED ...

  8. k8s pod重启 deployment重启

    1.15版本之后可通过kubectl rollout restart deployment -n 命令来实现滚动重启POD 该命令会先创建待用POD,待新POD运行成功后,再关闭原有POD.因此需要保 ...

  9. Mybatis plus 多表联查字段名重复报错 Column ‘id‘ in where clause is ambiguous

    一.报错信息 Caused by: Column 'xxxx' in where clause is ambiguous 二.报错原因 表 person 和 表 class 都有字段 id 和 nam ...

  10. Composer: Command Not Found

    I am using CentOS and had same problem. I changed /usr/local/bin/composer to /usr/bin/composer and i ...