.NET 2.0 中,两种如何创建一个线程安全的 UI 的方法
2008-02-05 09:18
579 查看
刚刚编写了线程安全的代码,该方法示例执行 Windowns Forms Event Handler 跨线程 UI 调用,BindXmlDocumentToTreeView 是一个绑定 Xml 到一个 TreeView 控件的方法,其可以很好的工作于不同的线程。它首先检查 Control(TreeView)的 InvokeRequired 属性,以判断是否是与 UI 线程不同的线程调用,然后使用 TreadPool 工具,并借助 .Net 2.0 中的匿名代理,使用 TreadStart 委托。方法中调用了真正的执行方法(BindXmlDocumentToTreeViewInternal)。
方法一:
public static void BindXmlDocumentToTreeView(XmlDocument xmlDocument, TreeView tv)
{
if (tv.InvokeRequired)
{
ThreadPool.QueueUserWorkItem(delegate(object obj)
{
tv.Invoke(new ThreadStart(delegate()
{
BindXmlDocumentToTreeViewInternal(xmlDocument, tv);
}));
});
}
else
{
BindXmlDocumentToTreeViewInternal(xmlDocument, tv);
}
}
private static void BindXmlDocumentToTreeViewInternal(XmlDocument xmlDocument, TreeView tv)
{
if (xmlDocument != null && tv != null)
{
TreeNode root;
root = AddTreeViewNode(xmlDocument.DocumentElement);
tv.Nodes.Add(root);
}
}
这种方案使用了 TreadStart 代理,并使用线程池,可以很好的改善 UI 的性能,另外还有一种方式
方法二:
public static void BindXmlDocumentToTreeView(XmlDocument xmlDocument, TreeView tv)
{
if (tv.InvokeRequired)
{
tv.Invoke(new MethodInvoker(delegate { BindObjectParametersInternal(paramObject, node.Nodes); }));
}
else
{
BindObjectParametersInternal(paramObject, node.Nodes);
}
}
这种方案使用了 MethodInvoker 同事没有使用线程池工具,两种方法可以达到同样的效果,具体选用哪种方式,可能根据大家的喜欢和要求,比如是否使用线程池,ThreadStart 代理与 MethodInvoker 并无本质差异,他们都是无参数代理,你也可以定义自己的代理,因为代理中,我们并没有定义真正执行方法的参数,这也是我比较喜欢的一个原因。
关于线程安全 UI 方法,以及匿名代理,大家可以参考 Roy Osherove 的博客,阅读 The 3 ways to create a Thread-Safe GUI with .NET 2.0, with one clear winner. 这篇文章。本文在其基础之上有所改进,把正在的执行逻辑从线程安全处理方法中分离出来。
方法一:
public static void BindXmlDocumentToTreeView(XmlDocument xmlDocument, TreeView tv)
{
if (tv.InvokeRequired)
{
ThreadPool.QueueUserWorkItem(delegate(object obj)
{
tv.Invoke(new ThreadStart(delegate()
{
BindXmlDocumentToTreeViewInternal(xmlDocument, tv);
}));
});
}
else
{
BindXmlDocumentToTreeViewInternal(xmlDocument, tv);
}
}
private static void BindXmlDocumentToTreeViewInternal(XmlDocument xmlDocument, TreeView tv)
{
if (xmlDocument != null && tv != null)
{
TreeNode root;
root = AddTreeViewNode(xmlDocument.DocumentElement);
tv.Nodes.Add(root);
}
}
这种方案使用了 TreadStart 代理,并使用线程池,可以很好的改善 UI 的性能,另外还有一种方式
方法二:
public static void BindXmlDocumentToTreeView(XmlDocument xmlDocument, TreeView tv)
{
if (tv.InvokeRequired)
{
tv.Invoke(new MethodInvoker(delegate { BindObjectParametersInternal(paramObject, node.Nodes); }));
}
else
{
BindObjectParametersInternal(paramObject, node.Nodes);
}
}
这种方案使用了 MethodInvoker 同事没有使用线程池工具,两种方法可以达到同样的效果,具体选用哪种方式,可能根据大家的喜欢和要求,比如是否使用线程池,ThreadStart 代理与 MethodInvoker 并无本质差异,他们都是无参数代理,你也可以定义自己的代理,因为代理中,我们并没有定义真正执行方法的参数,这也是我比较喜欢的一个原因。
关于线程安全 UI 方法,以及匿名代理,大家可以参考 Roy Osherove 的博客,阅读 The 3 ways to create a Thread-Safe GUI with .NET 2.0, with one clear winner. 这篇文章。本文在其基础之上有所改进,把正在的执行逻辑从线程安全处理方法中分离出来。
相关文章推荐
- .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
- .NET一个线程更新另一个线程的UI(两种实现方法及若干简化)
- owb之使用OWB安全UI使目标方案称为OWB用户和repository assistant创建一个新用户两种方法作用都是一样的
- 90页第三题,创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 ,编程利用Rectangle输出一个矩形的
- [VB.NET]问下 :自己写的com,其中一个接口方法返回一个variant类型的值,在.net中如何接收啊
- 利用JavaScript如何创建一个table表格[第2种方法]
- 一种强行指定dll assembly读取其相应*.dll.config配置文件的方法(又名:如何创建.net 的DCOM)
- 1.创建一个Rectangle类,添加width和height两个成员变量。 2.在Rectangle中添加两种方法分别计算矩形的周长和面积 3.编程利用Rectangle输出一个矩形的周
- //用new创建一个二维数组,有两种方法,是等价的
- 种强行指定dll assembly读取其相应*.dll.config配置文件的方法(又名:如何创建.net 的DCOM)(转自:http://blog.csdn.net/shaily/article)
- 安装vs2010后不能创建.net2.0项目的解决方法
- .net创建XML文件的两种方法
- 如何通过创建一个Fraction类(分数)来实现分数的加减乘除,比较大小、约分等方法(方法的实现部分)
- 创建一个 Rectangle类,添加width和lenght两个成员变量 在 Rectangle类中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周长和面积
- 一个简单登陆框的变化+更新了如何连接sql数据库,获得数据集,比较两种方法(数据集和读数据)
- 1.创建一个Rectangle类,添加width和height两个成员变量。 2.在Rectangle中添加两种方法分别计算矩形的周长和面积 3.编程利用Rectangle输出一个矩形的周
- 如何去掉DataTable中的重复行(新增.net 2.0中最新解决方法---简便)
- 创建一个Rectangle类,添加width和height两个成员变量 在Rectangle中添加两种方法分别计算矩形的周长和面积 编程利用Rectangle输出一个矩形的周
- OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
- 如何去掉DataTable中的重复行(新增.net 2.0中最新解决方法---简便)