一个经典的例子:


问题:

都说Invoke是同步的,BeginInvoke是异步的,但为何用BeginInvoke做耗时操作依然会卡死UI?

http://www.cnblogs.com/blosaa/archive/2013/05/30/3107381.html

小结:

BeginInvoke的异步是指相对于调用BeginInvoke的线程异步,而不是相对于UI线程异步。所以在UI线程调用BeginInvoke依然会卡死UI。  

解决办法是开一个子线程,耗时操作在该子线程中完成,完成后在子线程中调用BeginInvoke交由UI线程更新界面,而不是在UI线程中调用BeginInvoke。

注意,记好Control的Invoke和BeginInvoke都执行在主线程即UI线程上!(这是Winform的情况,WPF中交由Control所关联的Dispatcher来处理,Control身上没有Invoke和BeginInvoke)


测试发现,C#的主线程(UI线程)默认是未命名的,Name属性为null。想要知道获得的线程是否为主线程,可以在Visual Studio的【线程】窗口中看到,如下图。既然不知道线程的Name,那么还可以通过线程的托管ID来知晓。

Thread objThread = new Thread(new ThreadStart(delegate
{
Console.WriteLine("当前线程ID = " + Thread.CurrentThread.ManagedThreadId); // 是子线程
Console.WriteLine("当前线程ID = " + Application.Current.Dispatcher.Thread.ManagedThreadId); // 是UI线程
}));

关于使用ManualResetEvent使线程阻塞与继续:

【C#】多线程解决UI界面卡死的问题的更多相关文章

  1. Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文:Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析 前段时间,公司同事开发了一个小工具,在工具执行过程中,UI界面一直处于卡死状态. 通过阅读代码发现,主要是 ...

  2. 双缓冲队列解决WPF界面卡死

    工作中的项目,CS客户端会通过MQ接收前端设备发送的信息,之前测试的时候,由于测试的数据不大,没有进行压力测试,软件可以正常工作,随着项目现场设备数量的增加,CS客户端从MQ中订阅的数据量不断增加,最 ...

  3. 多线程、委托、Invoke解决winform界面卡死的问题,并带开关

    一.知识点介绍 1,更新控件的内容,应该调用控件的Invoke方法. Invoke指: 在拥有控件的基础窗口句柄的线程上,用指定的参数列表执行指定委托.该方法接收一个委托类型和委托的参数,因此需要定义 ...

  4. WPF--Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析

    原文地址: http://www.tuicool.com/articles/F7reem http://blog.csdn.net/yl2isoft/article/details/11711833 ...

  5. WinForm多线程+委托防止界面卡死

    1.当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Gener ...

  6. Centos7解决图形界面卡死问题

    经常会遇到图形界面卡死,搜了一搜,解决办法如下: killall -9 gnome-shell

  7. wPF,解决UI界面实时更新的问题

    private void button1_Click(object sender, RoutedEventArgs e) { Thread thread = new Thread(new Thread ...

  8. 多线程操作UI界面的示例 - 更新进度条

    http://blog.csdn.net/liang19890820/article/details/52186626

  9. C#多线程解决界面卡死问题的完美解决方案

    C#多线程解决界面卡死问题的完美解决方案 文章转自http://www.sufeinet.com/thread-3556-1-1.html 问题描述: 当我们的界面需要在程序运行中不断更新数据时, 当 ...

随机推荐

  1. linux手工释放内存

    先使用sync命令以确保文件系统的完整性,sync 命令运行 sync 子例程,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node.已延迟的块 I/O 和读写映射文件. 再执行下面任意一条命 ...

  2. Python -- map, Lambda, filter and reduce

    map(func, seq)对seq中的每一个元素,调用func并返回结果.典型的应用是使用lambda函数. >>> def square(x): return x**2 > ...

  3. 如何在ppt或word中添加高亮代码?

    如何在ppt或word中添加高亮代码? 问题: 如何ppt中添加带有语法高亮的程序代码,就如同下面的形式(在ppt嵌入高亮代码,且可以编辑,带有行号) 详细的要求如下: 1.代码带有语法高亮. 2.结 ...

  4. nginx 读取文件 permission denied

    nginx 是在root用户下安装的,静态网页的目录/var/www/html/ 目录下的内容所有者也是root 用户,按照 nginx配置文件中location说明 配置静态文件访问地址. 使用网址 ...

  5. java中比较两个double类型值的大小

    非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型,具体 BigDecimal的详细说明参考jdk开发帮助文档. import java.math.BigDecimal; pu ...

  6. js前台取用后台传递过来的map集合方式

    在处理有些特殊需求的时候,我们需要在前台页面的js中获取后台传递过来的map集合类型的参数,并且进行调用,代码如下: 在后台我们拼装出如下的集合: Map<String,Grade> gr ...

  7. databus编译:Could not resolve all dependencies for configuration ':databus2-relay:databus2-event-producer-mock:compile

    FAILURE: Build failed with an exception. * What went wrong: Could not resolve all dependencies for c ...

  8. hbase ERROR: wrong number of arguments (3 for 4)

    hbase(main):036:0> get 'ddl', 'example', 'info:age'COLUMN                                         ...

  9. php基础面试题:

    1:print.print_r.echo到底有什么区别? 2:get和post的区别 echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对 ...

  10. 微信支付错误,页面URL末注册

    最近在做个项目用到微信支付的JSSDK支付时候碰到“URL末注册的问题”,可是我已经在公众平台里的支付目录里添加了,测试了几次都是这个问题,最后才发现原来是大小写的问题,还有我的支付页面是ASP.NE ...