博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步调用之精简方式
阅读量:7119 次
发布时间:2019-06-28

本文共 2568 字,大约阅读时间需要 8 分钟。

不知道在Winform代码中,你是否遇到过线程和UI交互的情况?然后你是不是都是按照这种方式来书写代码的:

public delegate void AddListViewCrossThreadDelegate(******); public void AddListViewCrossThreads(ListViewItem lvi,int action) {
if (lsvName.InvokeRequired) {
AddListViewCrossThreadDelegate d = new AddListViewCrossThreadDelegate(AddListViewCrossThreads); lsvName.Invoke(addlistviewdelegate, lvi,action); } else {
//这里添加实际操作控件的代码 } }

但是如果当一个页面中有大量的控件要涉及到UI交互,并且这些控件需要好多不同的参数,那么我们就不得不为这些控件声明具有不同参数的委托类型,然后再利用InvokeRequired来判断,最后编写世纪操控控件的代码。如果真是这样,那么这个工作量可真的是很大。并且这种Copy/Paste的工作可能让你发疯,重用性太差了,有没有好一点的方法呢?当然有:

通过观察发现,每个控件在进行线程和UI交互的时候,都需要判断以下是否需要进行线程交互(也就是判断是否需要InvokeRequired),那么这个操作能不能集成到一个类中完成呢?看代码:

using System.Windows.Forms; namespace CommonUntil {
public static class UIThread {
public static void UIInvoke(this Control control, MethodInvoker invoker) {
if (control.InvokeRequired) //如果产生了线程和界面的交互 {
control.Invoke(invoker); //利用MethodInvoker可以代替任意Delegate的方法 return; } else {
invoker.Invoke(); //触发交互事件 } } } }

那么,应该怎么使用呢?

假设我们需要望名称为lsvName的ListView控件中添加新的ListViewItem对象,并且我们规定,传入addFlag就表明是添加列表项,传入deleteFlag就是清空所有选项,我们会这么操作:

     public void AddListView(ListViewItem lvi,int action)         {
if (addFlag == action) {
this.lsvName.Items.Add(lvi); } else if (deleteFlag == action) {
this.lsvName.Items.Clear(); } }

如果在遇到线程交互的时候,我们该怎么做呢?我们只需要获取到ListViewItem对象和action,就可以通过我们实现的扩展方法来实现:

        for (int i = 0; i < myFiles.Count; i++)             {
FileInfo file = myFiles[i]; ListViewItem lvi = new ListViewItem(); lvi.Text = GetFileName.GetFileName(file.FullName); lvi.Tag = file.FullName; // store the fullname UIThread.UIInvoke(lsvName, delegate {
AddListView(lvi, addFlag); } ); }

或者直接干脆的这么写:

UIThread.UIInvoke(lsvName, delegate                    {
//AddListView(lvi, action); if (addFlag == action) {
this.lsvName.Items.Add(lvi); } else if (deleteFlag == action) {
this.lsvName.Items.Clear(); } } );

 这样,我们就不必对不同的参数每次都赋值进去,然后判断在操控,代码也简洁了许多,希望对你有用。

 

 

转载地址:http://fniel.baihongyu.com/

你可能感兴趣的文章
Netscaler 10.5 VPX与XenApp XenDesktop 集成配置系列之三enable StoreFront Remote Access
查看>>
五步搞定Android开发环境部署——非常详细的Android开发环境搭建教程(转)
查看>>
函数作为参数传递
查看>>
ViolinMemory上市遇低迷 唱衰闪存为哪般?
查看>>
shell脚本-监控系统资源并通过短信报警
查看>>
2014-03-08_javascrit_controller&status
查看>>
SaltStack配置管理之Gains与State测试
查看>>
Windows Server 2016-Hyper-V HNV 新增功能
查看>>
Navicat for oracle 提示 cannot load oci dll,193的解决方法
查看>>
python3中报错的解决方法(长期更新)
查看>>
带你走近AngularJS - 创建自定义指令
查看>>
VM虚拟机Linux克隆后网卡的相关操作
查看>>
我的友情链接
查看>>
Springboot学习(一)
查看>>
TensorFlow的基础概念04
查看>>
类的初始化和总结
查看>>
java 8 新特性 时间api使用实例
查看>>
SylixOS USB Gadget层介绍
查看>>
python设计模式之单例模式
查看>>
Pandas里面dataframe 中loc和iloc函数的区别
查看>>