原文地址: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. docker构建supervisor镜像

    1 介绍 记录使用docker 构建包含 supervior 的镜像, supervisor: 是一个管理和监控进程的程序,可以方便的通过配置文件来管理我们的任务脚本 将supervisor构建到系统 ...

  2. echarts 的使用

    <template> // option 通过id行绑定     <div id="myRangChart" style="width: 100%;he ...

  3. VB 不应该是这副模样出现

    和同时代的其它语言比,VB 设计的太烂了,应景之作,充满了各种小聪明. 当时有 JS, 有 python,VB 的设计者不懂参考借鉴,给出的是一个连继承都没有的设计. VB 的语言设计问题极多, 首选 ...

  4. django生命周期流程图与django路由层

    目录 一.django请求生命周期流程图 二.django路由层 1.路由匹配 2.转换器 3.正则匹配 不同版本的区别 正则匹配斜杠导致的区别 4.正则匹配的无名有名分组 分组匹配 无名分组 有名分 ...

  5. 【问题解决】Pycharm、IDAE等乱码问题:运行输出窗口就正常显示,调试乱码的问题

    添加如下内容 -Dfile.encoding=UTF-8 重启软件生效

  6. @Builder 注解的简单使用

    1.导语(可跳过) Java小白一枚,研读公司代码.发现实体类上加了@Builder.@NoArgsConstructor和@AllArgsConstructor.话不多说,上代码 2.实体类代码@D ...

  7. Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

    一.前言 之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput ...

  8. Qt编写安防视频监控系统68-兼容Qt4到Qt6

    一.前言 为了从Qt4.7兼容到Qt6.2及后续版本,着实花了不少精力,前提也是对自定义控件大全和各种跨平台的轮子组件全部做成了兼容Qt4到Qt6,这样只剩下UI这块需要兼容就好办多了,各个击破战略, ...

  9. IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf

    本文作者:丁同舟,来自金蝶随手记技术团队. 1.引言 接上篇<金蝶随手记团队的Protobuf应用实践(原理篇)>,本文将以iOS端的Objective-C代码为例,图文并茂地向您菔救绾卧 ...

  10. 前端实现 HTML 网页转 PDF 并导出🤓

    有个新需求,当点击[下载]按钮时,直接将当前 html页面下载为 PDF.通过 html2canvas + jsPDF 可实现PDF单页下载,甚至是多页下载,记录分享一下~ 最后有源码,可自取 htm ...