谈.Net委托与线程——解决窗体假死
转自:http://www.cnblogs.com/smartls/archive/2011/04/08/2008981.html#2457370
引言
基础理论
控件的线程安全检测
Control的Invoke和BeginInvoke
- Control.Invoke,Control.BeginInvoke和delegate.Invoke,delegate.BeginInvoke是不同的。
- Control.Invoke中的委托方法,执行在主线程,也就是我们的UI线程。而Control.BeginInvoke从命名上来看虽然具有异步调用的特征(Begin),但也仍然执行在UI线程。
- 如果在UI线程中直接调用Invoke和BeginInvoke,数据量偏大时,依然会造成UI的假死。
体验BeginInvoke
{
// 储存UI线程的标识符
int curThreadID = Thread.CurrentThread.ManagedThreadId;
new Thread((ThreadStart)delegate()
{
PrintThreadLog(curThreadID);
})
.Start();
}
privatevoid PrintThreadLog(int mainThreadID)
{
// 当前线程的标识符
// A代码块
int asyncThreadID = Thread.CurrentThread.ManagedThreadId;
// 输出当前线程的扼要信息,及与UI线程的引用比对结果
// B代码块
label1.BeginInvoke((MethodInvoker)delegate()
{
// 执行BeginInvoke内的方法的线程标识符
int curThreadID = Thread.CurrentThread.ManagedThreadId;
label1.Text =string.Format("Async Thread ID:{0},Current Thread ID:{1},Is UI Thread:{2}",
asyncThreadID, curThreadID, curThreadID.Equals(mainThreadID));
});
// 挂起当前线程3秒,模拟耗时操作
// C代码块
Thread.Sleep(3000);
}
Control.BeginInvoke的真正含义
所以,msdn对Control.BeginInvoke给出了这样的解释:在创建控件的基础句柄所在线程上异步执行指定委托。
Control.Invoke、BeginInvoke与Windows消息
{
using (new MultithreadSafeCallScope())
{
returnthis.FindMarshalingControl().MarshaledInvoke(this, method, args, true);
}
}
public IAsyncResult BeginInvoke(Delegate method, paramsobject[] args)
{
using (new MultithreadSafeCallScope())
{
return (IAsyncResult)this.FindMarshalingControl().MarshaledInvoke(this, method, args, false);
}
}
{
return entry;
}
if (!entry.IsCompleted)
{
this.WaitForWaitHandle(entry.AsyncWaitHandle);
}
Application.DoEvents
解决方案
尝试”无假死”
privatevoid button1_Click(object sender, EventArgs e)
{
new Thread((ThreadStart)(delegate()
{
for (int i =0; i < Max_Item_Count; i++)
{
// 此处警惕值类型装箱造成的"性能陷阱"
listView1.Invoke((MethodInvoker)delegate()
{
listView1.Items.Add(new ListViewItem(newstring[]
{ i.ToString(), string.Format("This is No.{0} item", i.ToString()) }));
});
};
}))
.Start();
}
问题分析
最终方案
- 新建Windows组件DBListView.cs,让它继承自ListView。
- 在控件中添加如下代码:
{
// 打开控件的双缓冲
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
}
{
new Thread((ThreadStart)(delegate()
{
for (int i =0; i < Max_Item_Count; i++)
{
// 此处警惕值类型装箱造成的"性能陷阱"
dbListView1.Invoke((MethodInvoker)delegate()
{
dbListView1.Items.Add(new ListViewItem(newstring[]
{ i.ToString(), string.Format("This is No.{0} item", i.ToString()) }));
});
};
}))
.Start();
}
转载于:https://www.cnblogs.com/jayying/p/3172618.html
谈.Net委托与线程——解决窗体假死相关推荐
- C# 解决窗体假死的状态
异步调用是CLR为开发者提供的一种重要的编程手段,它也是构建高性能.可伸缩应用程序的关键.在多核CPU越来越普及的今天,异步编程允许使用非常少的线程执行很多操作.我们通常使用异步完成许多计算型.IO型 ...
- 解决WindowsForm窗体假死的状态
转载 http://blog.sina.com.cn/s/blog_621e24e201015r29.html 另一篇非常不错的博文:http://www.cnblogs.com/wangshenhe ...
- .NET C# winform窗体假死
winform窗体假死 我们经常会遇到当执行一个比较大的函数时,窗体会出现假死的现象,给用户的体验不是很好,于是我们遇到了问题,那么就必须解决,我们该如何解决呢,首先在自己的脑里画个问号,接下来我们就 ...
- 如何解决Ubuntu假死机或进程被占用
目录 如何解决Ubuntu假死机 1.进入TTY终端字符界面(相当于Windows下的安全模式) 1.1.按Ctrl+Alt+F1 : TTY终端字符界面 1.2.打开[终端]:执行top命令 1 ...
- 教你几招解决电脑假死现象
不少电脑使用者在平常的生活中,都遇到过电脑"假死"的现象,也就是长时间卡机不动,点击什么都没反应.这让我们很无奈,尤其是在工作中,文档写了一半,突然死机,运气好还能恢复,运气不好的 ...
- android studio 假死机,解决Android-studio假死机建议
背景 终于第一个ios app发布应用商店送审了,这下也有时间把以前写的android更新一版,但是很久没遇到的as假死机问题又各种折腾了一天..最终解决的方法实在是让人忍无可忍,实在是想写下来给那些 ...
- 解决:IIS 假死,运行一段时间服务器上所有网站打不开,必须要重启服务器才行,重启IIS都没用。怎么解决,解决方案
tip:我服务器问题是 每个5-6天后,服务器上的所有网站都不能访问,重启IIS无用,必须重启服务器! 后,请教周华伟周经理后,找到解决方案如下: 第一原因: 这是程序池造成的,网站运行时,造成服务器 ...
- [硬核教程]如何解决电脑假死问题——适用于调用GPU有声音,无画面的情况。
本教程同样也适合游戏时帧率不稳的情况. 我日更了!!! 事情的起因是这样的,小达我之前图便宜,买了一张矿卡. 如图 但是收到货后没有搞压力测试,随后电脑屡次假死,我以为是硬盘问题,换了个SSD后依旧如 ...
- ajax异步超时,AjaxPro实现异步调用,解决浏览器假死及超时问题(示例代码)
平时使用AjaxPro的时候基本上非常easy var msg = UseClass.Method(argument).value; 由于后台响应比較慢,所以加了个"loading" ...
最新文章
- 常用的数据结构-队列
- 解决matplotlib中文乱码问题
- java 微信多媒体文件_java微信开发之上传下载多媒体文件
- h5页面禁止复制_网页禁止鼠标右键禁止全选复制粘贴的方法
- art-template入门(八)之选项
- 如何使用Quartz Scheduler和日志记录创建Web应用程序
- “国家科学数据中心”联合专刊征稿
- MVC为Html对象建立一个扩展方法,使用自己的控件就像使用TextBox一样方便
- html5上传使用FileReader,Promise图片预览
- Django--ORM基本操作
- [转]小品:宋江同志在梁山泊招安动员大会上的讲话
- 华为效仿苹果卖高价手机?滴滴顺风车开放灰度测试;苹果官微被投诉“攻陷”| 极客头条...
- xp大容量u盘补丁_大容量硬盘补丁
- 庄子梦游记之办公室有“云”
- 国内有哪些顶级技术团队的博客值得推荐?
- 运算放大器自激振荡仿真
- 触摸板把计算机从休眠状态唤醒,win10笔记本盒盖唤醒后触摸板失灵的处理方法...
- 写一个函数,求三个数和的平均值。
- springboot整合dubbo时连接zookeeper——天坑
- 百度地图离线开发2.0