C# 线程调用主线程中的控件
先来看一个“想当然”的代码。
private void showDateTimeMethod() { while (true) { //显示当前时间 label1.Text = "当前时间 " + DateTime.Now.ToString(); //线程暂停 Thread.Sleep(1000); } } private void Form1_Load(object sender, EventArgs e) { //新建一个线程 Thread showDateTimethread = new Thread(new ThreadStart(showDateTimeMethod)); //该线程为后台线程 showDateTimethread.IsBackground = true; //线程启动 showDateTimethread.Start(); }
用我的大腿想想,上面的代码应该是对的,但是由于net苛刻的安全机制,showDateTimeMethod中的代码是有错误的。为了解决这个错误可以声明一个委托类型,实例化一个委托变量(这话听起来很拗口),并给这个委托变量指定函数引用。
方法一,使用命名方法
//声明一个委托类型,该委托类型无输入参数和输出参数public delegate void ProcessDelegate(); //函数引用,label控件显示当前时间,输入参数无,输出参数无,和声明的委托类型形式一致public void LabelShow(){label1.Text = "当前时间 " + DateTime.Now.ToString();}
然后在线程中实例化一个委托变量,指向这个函数引用。
while (true){//使用命名方法 ProcessDelegate showProcess = new ProcessDelegate(LabelShow);//调用label的invoke方法 label1.Invoke(showProcess);//线程暂停 Thread.Sleep(1000);}
这样的话就可以在窗体中看到当前的时间了。
方法二,使用匿名方法
刚刚的函数引用只有区区一行,这一行完全可以使用匿名方法实现,如果使用匿名方法的话就可以免去编写一个函数,代码显得非常简洁。
匿名方法使用方法也很简单。
委托类型 委托变量 = delegate (【参数列表】){代码块};
while (true){//实例化一个委托变量,使用匿名方法构造 ProcessDelegate showProcess = delegate(){label1.Text = "当前时间 " + DateTime.Now.ToString();};label1.Invoke(showProcess);//线程暂停 Thread.Sleep(1000);}
方法三,使用MethodInvoker
再观察一下上面的代码,这个委托类型,输入参数无输出参数也无,就可以使用C#的MethodInvoker直接构造,关于MethodInvoker,MSDN给出这样一个解释“表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法”
//使用匿名方法2while (true){label1.Invoke(//委托,托管无参数的任何方法new MethodInvoker(delegate{label1.Text = "当前时间 " + DateTime.Now.ToString();}));//线程暂停 Thread.Sleep(1000);}
转载于:https://www.cnblogs.com/kennyliu/p/3745838.html
C# 线程调用主线程中的控件相关推荐
- 在子线程中更改主线程中的控件的信息,在子线程中用toast
一丶在子线程中不允许更改主线程中的控件的信息,也不允许在子线程中用toast,我们要更改的话 (1)消息机制:使用handler (由主线程调用) 在主程序中Handler handler = new ...
- C# 子线程中访问主线程中的控件
/** 要想线程操作主线程的控件,首先声明一个委托(delegate)D,* 然后实例化委托d,再然后再子线程中使用this.BeginInvoke(d),* 就可以访问主线程的控件.* */usin ...
- C#中子线程操作主线程中窗体上控件的方法
Demo this.listView1.Visible = true;this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处理 ...
- java 线程 函数_java – 从后台线程调用主线程上的函数
更新 我已经更新了这个问题,使用建议的SwingWorker类包含Java实现的源代码,以实现与Objective-C示例相同的结果.希望这将有助于未来的冒险家. Document myDoc = . ...
- C# 子线程调用主线程窗口中的TextBox控件
使用情景 开发环境:VS 2013 Pro, .Net Framework 4.5 C# 开发窗口程序,需要在开辟的子线程中调用textbox控件,修改显示内容 直接调用会报错,原因是跨线程操作,需要 ...
- html 调用c#dll中的控件,C#调用ActiveX控件的方法
C#调用ActiveX控件时通常要进行两步操作: 第一步:注册控件,例如ABE.DLL,将ABE.DLL拷贝至系统文件夹SYSTEM32下,然后在开始中执行CMD命令,regsvr32 ABE.DLL ...
- html 调用c#dll中的控件,C#实现反射调用动态加载的DLL文件中的方法和在窗体中加载DLL文件的用户控件...
反射的作用: 1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射. ...
- android listview多线程刷新各自的进度,从另一个线程更新主线程中的ListView
Yar.. 12 我个人使用自定义线程(扩展线程的类),但通过Message发送响应给UI线程.所以在线程的run()函数中有: Message msg; msg = Message.obtain() ...
- 心得 如何优雅地跨线程修改主线程窗口控件
编程环境要求:VS2008/FX2.0 众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的. 例如: private void button1_Click(ob ...
- MFC子线程访问主线程对话框程序的控件对象
最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...
最新文章
- 【quickhybrid】组件(自定义)API的实现
- MyEclipse 快捷键1(CTRL)
- 算法导论之贪心算法(Huffman编码和拟阵)
- 面试题整理17 输入一个字符串判断一个字符串是否是有效ip地址
- 使用mybatis-generator自动生成model、dao、mapping文件
- Go语言重点知识点1
- css控制的代码,通过CSS控制把网页上的代码美化
- flask带有传入参数既有URL还有其他参数类型:建议使用方式二(flask 使用查询字符串的方式)
- JVM 问题排查常用命令
- Python(8)_初学Python
- webview是什么东西_做性能优化前需要考虑什么?
- 网页资源嗅探java_网页资源嗅探器下载_ESFSoft URL Sniffer(嗅探网页音频视频文件) 1.1 英文版_极速下载站...
- latex中插入eps图片方法与遇到xdvipdfmx:fatal: Image inclusion failed for XXX的错误
- 曲奇云盘资源搜索引擎_曲奇云盘资源共享群组
- Java Cryptography
- 软件测试周刊(第60期):有事可做,是一个人保持zui佳状态的唯一途径。
- 观察者模式与推拉模型
- C51单片机-2只LED灯循环闪烁
- 聊聊kafka consumer offset lag increase异常
- 计算机领域的术语与缩写,计算机和生活常用缩写与术语