[转]C#利用委托跨线程更新UI数据
在使用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. }
[转]C#利用委托跨线程更新UI数据的更多相关文章
- C#利用委托跨线程更新UI数据
转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...
- C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)
概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...
- C# Winform 跨线程更新UI控件常用方法总结(转)
出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...
- 简短总结一下C#里跨线程更新UI(转)
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例
http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...
- 简短总结一下C#里跨线程更新UI
摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...
- C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它
C# 委托 / 跨线程访问UI / 线程间操作无效: 从不是创建控件“Form1”的线程访问它 网上的代码都比较复杂,还是这个简单 见代码, 简易解决办法: 主窗体代码 using System; ...
- Winform之跨线程更新UI
Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...
- C# 跨线程更新 UI
Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...
随机推荐
- 11.Find All Numbers Disappeared in an Array(找出数组中缺失的数)
Level: Easy 题目描述: Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements ...
- kuangbin专题十六 KMP&&扩展KMP HDU2594 Simpsons’ Hidden Talents
Homer: Marge, I just figured out a way to discover some of the talents we weren’t aware we had. Marg ...
- java.sql.Date/ java.util.Date/ java.util.Calendar 用法与区别
在 JDK API 这样解释," 在 JDK 1.1 之前,类 Date 有两个其他的函数.它允许把日期解释为年.月.日.小时.分钟和秒值.它也允许格式化和解析日期字符串.不过,这些函数的 ...
- svn 常用忽略
*.o *.lo *.la *.al .libs *.so *.so.[-]* *.a *.pyc *.pyo __pycache__ *.rej *~ #*# .#* .*.swp .DS_Stor ...
- 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_基元类型(一)
[概念] 编译器直接支持的数据类型 [C#基元类型与对应的 FCL 类型] C#基元类型 FCL 类型 说明 sbyte System.Sbyte 有符号8位值 byte System.Byte 无符 ...
- echarts图调用多个接口
html: <div id="sentimentMain1" style="width:960px;height:500px;margin:20px auto;&q ...
- hdu1387 模拟队列
Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- 使用 maven 打包 src/test/java下的文件,并用 java jar 跑打包出来的jar
https://blog.csdn.net/nba_2011/article/details/71296745
- python练习六十三:文件处理,读取文件内容,按内容生成文件
python练习六十三:文件处理 假设要读取code.txt文件中内容,code.txt文件内容如下 01 CN Chinese 02 US United States of America 03 J ...
- vscode写vue模板--代码片段
Ctrl+Shift+P打开命令输入 snippet (打开用户代码片段) 在输入vue(选择代码片段的语言) 如果搜索不到,安装一个插件 vueHelper 如果搜索到复制粘贴以下代码 { &quo ...