- 热门文章:
- · WEB页面TreeView的应用-(得到所有选中的节点)
- · DotNetNuke(DNN)
- · 枚举器模式(Enumerator pattern)
- · 用ASP.NET 1.1 新特征防止Script攻击
- · 关于ASP.Net中的时间处理
- · javascript实现的数据表格:冻结列、调整列宽和客户端排序
- · [常见问题]cookie使用1.Page与HttpContext的Request、Response
- · 怎样在页面和页面的用户控件进行交互
- · webform页面间传值的特殊方法
- · 怎么直接建立一个DataTable并且为之添加数据
- · 我的第一个Asp.Net程序
- · 如何把数据放到web不能访问的文件夹中并给用户下载?
使用Control.Invoke处理多线程应用程序界面
使用Control.Invoke处理多线程应用程序界面
使用单一线程,在进行大计算量或耗时的操作时,会使界面失去响应。Control.Invoke 提供了一个在工作线程中更新见面的简单办法。该函数会把作为参数的回调函数提交给应用程序的界面进程(一般是主线程)的队列中,等待处理。这样,对界面的操作便无须担心同步、互锁等问题。
以下例子摘自一个局域网资源搜索程序
可以看到,线程池中的工作线程通过调用TreeView的Invoke方法,并提供一个回调函数,来实现对TreeView的更新。
在Frameworks 1.1 中,部分简单的多线程更新界面并不需要这种操作,如修改一些静态文本框中的文本等。但在Frameworks 2.0,所有的操作都必须要以此方式完成。
private void SearchNet()
{
//清除所有根节点下的字节点
treeView1.Nodes[0].Nodes.Clear();
for (uint i = IPStart; i <= IPEnd; i++)
{
//把整数转化IP地址,添加任务到线程池
ThreadPool.QueueUserWorkItem(new WaitCallback(Search),
("\\\\" + (i >> 24).ToString() + @#.@# +
(((int) i & 0x00ff0000) >> 16).ToString() + @#.@# +
(((int) i & 0x0000ff00U) >> 8).ToString() + @#.@# + (i%256).ToString()));
}
}
delegate void Updater(TreeNode Parent, TreeNode Child);
public void UpdateTreeView(TreeNode Parent, TreeNode Child)
{
Parent.Nodes.Add(Child);
treeView1.Nodes[0].Expand();
foreach (TreeNode n in treeView1.Nodes[0].Nodes)
{
n.Expand();
}
}
private void Search(object Host)
{
WKSTA_INFO_100 stainfo;
//尝试连接
if(Connect(Host,out stainfo))
{
TreeNode nodecomputer = new TreeNode(stainfo.wki100_computername);
//搜索共享
SearchServer(nodecomputer,stainfo, (string)Host);
}
}
private void SearchServer(TreeNode nodecomputer,WKSTA_INFO_100 stainfo, string Host)
{
/*其它代码*/
treeView1.Invoke(new Updater(UpdateTreeView), new object[] {nodecomputer, node});
/*其它代码*/
}
private void SearchNet()
{
//清除所有根节点下的字节点
treeView1.Nodes[0].Nodes.Clear();
for (uint i = IPStart; i <= IPEnd; i++)
{
//把整数转化IP地址,添加任务到线程池
ThreadPool.QueueUserWorkItem(new WaitCallback(Search),
("\\\\" + (i >> 24).ToString() + @#.@# +
(((int) i & 0x00ff0000) >> 16).ToString() + @#.@# +
(((int) i & 0x0000ff00U) >> 8).ToString() + @#.@# + (i%256).ToString()));
}
}
delegate void Updater(TreeNode Parent, TreeNode Child);
public void UpdateTreeView(TreeNode Parent, TreeNode Child)
{
Parent.Nodes.Add(Child);
treeView1.Nodes[0].Expand();
foreach (TreeNode n in treeView1.Nodes[0].Nodes)
{
n.Expand();
}
}
private void Search(object Host)
{
WKSTA_INFO_100 stainfo;
//尝试连接
if(Connect(Host,out stainfo))
{
TreeNode nodecomputer = new TreeNode(stainfo.wki100_computername);
//搜索共享
SearchServer(nodecomputer,stainfo, (string)Host);
}
}
private void SearchServer(TreeNode nodecomputer,WKSTA_INFO_100 stainfo, string Host)
{
/*其它代码*/
treeView1.Invoke(new Updater(UpdateTreeView), new object[] {nodecomputer, node});
/*其它代码*/
}
private void SearchNet()
{
//清除所有根节点下的字节点
treeView1.Nodes[0].Nodes.Clear();
for (uint i = IPStart; i <= IPEnd; i++)
{
//把整数转化IP地址,添加任务到线程池
ThreadPool.QueueUserWorkItem(new WaitCallback(Search),
("\\\\" + (i >> 24).ToString() + @#.@# +
(((int) i & 0x00ff0000) >> 16).ToString() + @#.@# +
(((int) i & 0x0000ff00U) >> 8).ToString() + @#.@# + (i%256).ToString()));
}
}
delegate void Updater(TreeNode Parent, TreeNode Child);
public void UpdateTreeView(TreeNode Parent, TreeNode Child)
{
Parent.Nodes.Add(Child);
treeView1.Nodes[0].Expand();
foreach (TreeNode n in treeView1.Nodes[0].Nodes)
{
n.Expand();
}
}
private void Search(object Host)
{
WKSTA_INFO_100 stainfo;
//尝试连接
if(Connect(Host,out stainfo))
{
TreeNode nodecomputer = new TreeNode(stainfo.wki100_computername);
//搜索共享
SearchServer(nodecomputer,stainfo, (string)Host);
}
}
private void SearchServer(TreeNode nodecomputer,WKSTA_INFO_100 stainfo, string Host)
{
/*其它代码*/
treeView1.Invoke(new Updater(UpdateTreeView), new object[] {nodecomputer, node});
/*其它代码*/
}
总结如下:
1、 定义委托
2、 定义回调函数
3、 调用Control.Invoke()
个人感觉语法较麻烦,尤其是对每种界面修改都必须定义一种委托(因为参数不同),有办法改进么?
- · How to handle the concurrency problems on ASP.Net Database
- · 后台动态设置前台标签内容和属性
- · ASP.NET中让同一个页面不同的文本框回车响应不同的事件
- · 认识ASP.NET配置文件Web.config
- · 将ArrayList中的ListItem绑定到DropDownList中去
- · 安全存放web项目数据库连接字符串
- · 分享:Project级别的权限控制
- · Solidworks二次开发—06—在装配体中添加配合
- · 在Repeater中嵌套使用Repeater
- · 一个简单的加密/解密方法
- · 加入身份验证信息的SMTP mail发送
- · webconfig的设置节点说明
- · 现有的Web打印控制技术分成几种方案
- · 一段实现DataGrid的“编辑”、“取消”功能脚本[无刷新]
- · WEB图片高清晰浏览同打印
- · Tangram与软件的组合构造
- · solidworks二次开发-04-修改数据
- · Solidworks二次开发-05-装配体中插入零部件
- · solidworks二次开发-03-访问特征数据
- · solidworks二次开发-02-用来访问特征的两个API
- · solidworks二次开发-01-录制一个宏
- · 有关于web播放器的列表播放问题
- · Microsoft User Interface Process Application Block 研究(3)
- · ASP.NET中使用IFRAME建立类Modal窗口
- · 挤压造型Extrusion的节点说明和应用实例
- · .net 里面 protected private 的变量也可以访问
- · 怎样得到一个系统盘的全名,不是字符,是全名,如:本地磁盘(C:)?
- · ASP.NET中新的代码编译功能(三)
- · ASP.NET中新的代码编译功能(二)
- · ASP.NET中新的代码编译功能(一)
- · asp.net里,一个小的自定义错误显示
- · ASP.NET编程中的十大技巧
- · 在ASP.NET中面向对象的编程思想
- · 有史以来最牛B的.NET程序集加密方法?
- · 在ASP.NET中实现多文件上传
- · (论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?
- · (论坛答疑点滴)有的时候DataGrid取值取不到?
- · (论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?
