在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题。其实不仅仅是界面,一般情况下,我们往往需要获得线程的一些信息来确定线程的状态。比较好的方式是用委托实现,看例子:

 class TestClass { //声明一个delegate(委托)类型:testDelegate,该类型可以搭载返回值为空,参数只有一个(long型)的方法。 public delegate void testDelegate(long i); //声明一个testDelegate类型的对象。该对象代表了返回值为空,参数只有一个(long型)的方法。它可以搭载N个方法。 public testDelegate mainThread; /// <summary> /// 测试方法 /// </summary> public void testFunction()  { long i = 0; while(true) { i++; mainThread(i); //调用委托对象 Thread.Sleep(1000);  //线程等待1000毫秒 } } }

  winform界面代码:

1. /// <summary>
2. /// 按钮单击事件
3. /// </summary>
4. /// <param name="sender"></param>
5. /// <param name="e"></param>
6. private void button1_Click(object sender, EventArgs e)
7. {
8.     //创建TestClass类的对象
9.     TestClass testclass = new TestClass();
10.
11.     //在testclass对象的mainThread(委托)对象上搭载两个方法,在线程中调用mainThread对象时相当于调用了这两个方法。
12.     testclass.mainThread = new TestClass.testDelegate(refreshLabMessage1);
13.     testclass.mainThread += new TestClass.testDelegate(refreshLabMessage2);
14.
15.     //创建一个无参数的线程,这个线程执行TestClass类中的testFunction方法。
16.     Thread testclassThread = new Thread(new ThreadStart(testclass.testFunction));
17.     //启动线程,启动之后线程才开始执行
18.     testclassThread.Start();
19. }

  

21. /// <summary>
22. /// 在界面上更新线程执行次数
23. /// </summary>
24. /// <param name="i"></param>
25. private void refreshLabMessage1(long i)
26. {
27.     //判断该方法是否被主线程调用,也就是创建labMessage1控件的线程,当控件的InvokeRequired属性为ture时,说明是被主线程以外的线程调用。如果不加判断,会造成异常
28.     if (this.labMessage1.InvokeRequired)
29.     {
30.         //再次创建一个TestClass类的对象
31.         TestClass testclass = new TestClass();
32.         //为新对象的mainThread对象搭载方法
33.         testclass.mainThread = new TestClass.testDelegate(refreshLabMessage1);
34.         //this指窗体,在这调用窗体的Invoke方法,也就是用窗体的创建线程来执行mainThread对象委托的方法,再加上需要的参数(i)
35.         this.Invoke(testclass.mainThread,new object[] {i});
36.     }
37.     else
38.     {
39.         labMessage1.Text = i.ToString();
40.     }
41. }
42.
43. /// <summary>
44. /// 在界面上更新线程执行次数
45. /// </summary>
46. /// <param name="i"></param>
47. private void refreshLabMessage2(long i)
48. {
49.     //同上
50.     if (this.labMessage2.InvokeRequired)
51.     {
52.         //再次创建一个TestClass类的对象
53.         TestClass testclass = new TestClass();
54.         //为新对象的mainThread对象搭载方法
55.         testclass.mainThread = new TestClass.testDelegate(refreshLabMessage2);
56.         //this指窗体,在这调用窗体的Invoke方法,也就是用窗体的创建线程来执行mainThread对象委托的方法,再加上需要的参数(i)
57.         this.Invoke(testclass.mainThread, new object[] { i });
58.     }
59.     else
60.     {
61.         labMessage2.Text = i.ToString();
62.     }
63. }

  

转载于:https://www.cnblogs.com/lxGIS/p/4268426.html

[转]C#利用委托跨线程更新UI数据相关推荐

  1. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现"线程间操作无效: 从不是创建控件的线程访问它"的异常.处理跨线程更新Winform UI控件常用 ...

  2. C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它...

    C# 委托 / 跨线程访问UI /  线程间操作无效: 从不是创建控件"Form1"的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 usin ...

  3. 简短总结一下C#里跨线程更新UI

    简短总结一下C#里跨线程更新UI 摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问 ...

  4. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  5. 同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结

    同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结 在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作.因此,稍微复杂一点的程 ...

  6. C#-WinForm跨线程修改UI界面

    背景 在我做WinForm开发的过程中,经常会遇到耗时操作或阻塞操作.他们会引发软件的卡顿甚至假死,严重影响软件的使用.因此,这类耗时或阻塞的操作一般都会使用异步的方式去执行,不影响主线程(UI线程) ...

  7. C#跨线程更新控件(UI)使用delegate方式

    C#跨线程更新(获取)控件(UI)使用delegate方式 在做界面开发的时候经常用到多线程,并且要在work线程中对控件或者界面进行操作,下面给出几种常用的操作方法 使用匿名委托到主线程中进行UI异 ...

  8. 经验证过的跨线程更新辅助类MyInvokeHelper

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. Android中Activity、Window、ViewRootImpl与子线程更新UI

    三者层级关系 1.Window Window是一个抽象类,唯一的实现类是PhoneWindow Window分为三种类型应用Window.子Window.系统Window.子Window无法独立存在必 ...

最新文章

  1. 人民日报钟声:以和平合作守护世界安全
  2. ebtables之BROUTING和PREROUTING的redirect的区别
  3. Android开发笔记(四十六)手机相关事件
  4. 使用gogs搭建git私有仓库
  5. C语言:判断m是否为素数
  6. javascript中数组循环的方式
  7. A[1054] The Dominant Colour (map!!)
  8. 汉字编码之GBK编码(附完整码表)
  9. matlab编辑器风格定制,怎么使用135编辑器编辑出文艺清新的风格排版(附文艺排版素材)?...
  10. WebVTT字幕格式
  11. 贝尔曼方程怎么解_贝尔曼方程
  12. DebugView工具使用方法
  13. 周杰伦中文网登录页面
  14. 哪款蓝牙耳机音质好?2020国产高性价比高音质蓝牙耳机分享
  15. 财富自由:当你实现财富自由就无需为钱而工作!
  16. 电脑运行慢?更频繁地使用它
  17. Jexus 安装配置,官网说明
  18. 好书推荐——厚黑学全书 (作者 李宗吾)
  19. 智慧楼宇中的“黑科技”
  20. Android Studio App开发入门之选择按钮的讲解及使用(包括复选框,开关按钮,单选按钮,附源码)

热门文章

  1. 智数合一,智慧工厂的四大典型应用场景
  2. oracle 调用java 类_oracle数据库PL SQL调用Java类程序代码
  3. sql语句php不执行mysql执行_为什么我写的php代码不执行sql语句呢,请大侠指点。...
  4. python 多继承与super使用详解_Python super()方法、多继承以及MRO顺序
  5. Tomcat启动乱码及IDEA中tomcat信息乱码解决方法
  6. Python函数之返回多值
  7. (C语言)二维整型数组的“最大点”(驻点)
  8. PyTorch Cookbook by Eric
  9. JNI编程中数据类型转换的方法
  10. Python将csv格式转换为xlsx