先来看一个“想当然”的代码。

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# 线程调用主线程中的控件相关推荐

  1. 在子线程中更改主线程中的控件的信息,在子线程中用toast

    一丶在子线程中不允许更改主线程中的控件的信息,也不允许在子线程中用toast,我们要更改的话 (1)消息机制:使用handler (由主线程调用) 在主程序中Handler handler = new ...

  2. C# 子线程中访问主线程中的控件

    /** 要想线程操作主线程的控件,首先声明一个委托(delegate)D,* 然后实例化委托d,再然后再子线程中使用this.BeginInvoke(d),* 就可以访问主线程的控件.* */usin ...

  3. C#中子线程操作主线程中窗体上控件的方法

    Demo this.listView1.Visible = true;this.listView1.BeginUpdate();this.listView1.EndUpdate(); //结束数据处理 ...

  4. java 线程 函数_java – 从后台线程调用主线程上的函数

    更新 我已经更新了这个问题,使用建议的SwingWorker类包含Java实现的源代码,以实现与Objective-C示例相同的结果.希望这将有助于未来的冒险家. Document myDoc = . ...

  5. C# 子线程调用主线程窗口中的TextBox控件

    使用情景 开发环境:VS 2013 Pro, .Net Framework 4.5 C# 开发窗口程序,需要在开辟的子线程中调用textbox控件,修改显示内容 直接调用会报错,原因是跨线程操作,需要 ...

  6. html 调用c#dll中的控件,C#调用ActiveX控件的方法

    C#调用ActiveX控件时通常要进行两步操作: 第一步:注册控件,例如ABE.DLL,将ABE.DLL拷贝至系统文件夹SYSTEM32下,然后在开始中执行CMD命令,regsvr32 ABE.DLL ...

  7. html 调用c#dll中的控件,C#实现反射调用动态加载的DLL文件中的方法和在窗体中加载DLL文件的用户控件...

    反射的作用: 1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型 2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射. ...

  8. android listview多线程刷新各自的进度,从另一个线程更新主线程中的ListView

    Yar.. 12 我个人使用自定义线程(扩展线程的类),但通过Message发送响应给UI线程.所以在线程的run()函数中有: Message msg; msg = Message.obtain() ...

  9. 心得 如何优雅地跨线程修改主线程窗口控件

    编程环境要求:VS2008/FX2.0 众所周知,从VS2005/FX2.0起,在多线程环境下是不允许跨线程修改主线程上窗口控件的. 例如: private void button1_Click(ob ...

  10. MFC子线程访问主线程对话框程序的控件对象

    最近在使用 VC 开发软件时需要用到多线程同步来解决开发过程中遇到的问题.本来以为只要象控制台程序一样,在主线程创建子线程,并设置好相应的对象事件就能解决问题,但是等到真正做起来,才在实践中发现原来事 ...

最新文章

  1. 【quickhybrid】组件(自定义)API的实现
  2. MyEclipse 快捷键1(CTRL)
  3. 算法导论之贪心算法(Huffman编码和拟阵)
  4. 面试题整理17 输入一个字符串判断一个字符串是否是有效ip地址
  5. 使用mybatis-generator自动生成model、dao、mapping文件
  6. Go语言重点知识点1
  7. css控制的代码,通过CSS控制把网页上的代码美化
  8. flask带有传入参数既有URL还有其他参数类型:建议使用方式二(flask 使用查询字符串的方式)
  9. JVM 问题排查常用命令
  10. Python(8)_初学Python
  11. webview是什么东西_做性能优化前需要考虑什么?
  12. 网页资源嗅探java_网页资源嗅探器下载_ESFSoft URL Sniffer(嗅探网页音频视频文件) 1.1 英文版_极速下载站...
  13. latex中插入eps图片方法与遇到xdvipdfmx:fatal: Image inclusion failed for XXX的错误
  14. 曲奇云盘资源搜索引擎_曲奇云盘资源共享群组
  15. Java Cryptography
  16. 软件测试周刊(第60期):有事可做,是一个人保持zui佳状态的唯一途径。
  17. 观察者模式与推拉模型
  18. C51单片机-2只LED灯循环闪烁
  19. 聊聊kafka consumer offset lag increase异常
  20. 计算机领域的术语与缩写,计算机和生活常用缩写与术语

热门文章

  1. 多线程的关键是,不同线程对象要独立
  2. 黎曼ζ 函数中的Γ是否与欧拉B函数中的Γ一样
  3. 管理感悟:如何处理不干活的主管
  4. matlab中TCR触发,TCR+FC型SVC的研究及MATLAB仿真
  5. easyui---tree拖拽同步到数据库
  6. Linux下常用安全策略设置方法
  7. 李洪强经典面试题45
  8. 简单的form表单操作(Servlet)
  9. 如何保持自己 fork 的项目和原始项目同步
  10. 第十六讲:菜单 Android Menu(转)