一个经典的例子:


问题:

都说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. 基础002_V7-CLB

    一.综述 参考ug474.pdf: 7系列中,一个CLB包含两个slice: 每个CLB的资源: CLB可配置的主要功能: 二.主要功能 LUT是基本单元,例如选择器assign muxout =  ...

  2. 直接获取摄像头传回的图像数据(人脸、微笑、眨眼: 识别-->第一步):图像识别第一步

    转:ios通过摄像头获取特定数据(http://www.2cto.com/kf/201404/290777.html) 凝视: 因为近期项目需求,须要一个可以实现对摄像头图片获取当中部分内容的功能,类 ...

  3. eclipse自动切换到debug视图

    原文出自:http://blog.csdn.net/yizhizouxiaqu/article/details/7594502 当弹出"Confir Perspective Switch&q ...

  4. Nginx做转发

    二台服务器,服务器A做域名转外,所有外网的域名都到这台服务器A的80端口上,服务器B内网地址192.168.1.227, 上面IIS搭建了N多网站,以端口来区分,用以前的方式 配置转发 结果发现首页能 ...

  5. 【Unity】12.3 Off Mesh Link组件

    开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 Off Mesh Link组件用于手动指定路线来生成分离的网格连接.例如,游戏中让行进对象上下 ...

  6. vue-router新手指南

    在学习完vue.js以及vuex之后,我们还剩下vue全家桶中的最后一个需要学习的组件,这就是vue-router了,本篇文章我们就来一起认识和入门vue-router.为什么我们只是入门呢?因为在这 ...

  7. 【小白的CFD之旅】24 稳态和瞬态

    小白最近在练习案例的时候,对稳态和瞬态的问题,产生了一些疑问.譬如说,为什么有的案例用稳态,而有的案例用瞬态?有时候相同的案例既可以用稳态也可以用瞬态,而有的案例却只能用瞬态计算?小白决定找小牛师兄问 ...

  8. pandas数组(pandas Series)-(1)

    导入pandas import pandas as pd countries = ['Albania', 'Algeria', 'Andorra', 'Angola', 'Antigua and Ba ...

  9. debian8.5安装sublime text3

    在官网www.sublimetext.com下载安装包 我这里用的是Ubuntu 64 bit版. 下载后使用su命令切换到root账户. 执行安装命令 dpkg -i sublime-text*.d ...

  10. Silverlight-MEF-DEMO

    “托管扩展性框架(Managed Extensibility Framework,简称MEF),是微软.NET框架下为提高应用和组件复用程度而推出的,用于使组件能够最大化的重用.使用MEF能够使静态编 ...