当前位置: 网赚博客 > 编程语言 >winform多线程更新UI问题实战测试

winform多线程更新UI问题实战测试

发布时间:2020-09-02 12:05:35 | 作者: 迪克酥酥 | 分类:编程语言 | 833 | 459 | 791

测试结果:经过迪克酥酥大量测试,根本就不存在什么多线程更新UI,在winform中主线程就是UI线程不管你用beginInvoke 还是invoke 都是通知主线程更新UI数据,如果需要多线程异步执行就不要频繁更新UI数据。如果频繁更新数据,就算你程序在线程中执行,照样能把主界面卡死。

winform多线程更新UI问题实战测试问题:

都说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线程上!


 测试发现,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线程}));


来源:(QQ/微信:313919848),转载请保留出处和链接!

本文链接: https://www.u5fuye.com/post/33370

本文标签:

更新UI winform
网站出售 关注迪克酥酥学习网赚技巧

相关阅读:

.net 5.0 ASP.NET Core 入门教程

c# socket 映射 转发

Visual Studio 中设置 JavaScript/TypeScript 的断点 脚本出现

Dotfuscator 使用图解教程代码混淆,压缩器防止反编译

Centos7中安装宋体和微软雅黑

评论区

    本文暂时没有评论,来添加一个吧(●'◡'●)

    欢迎您发表评论:

    站内搜索