相信对多线程有所了解的人都知道,子线程是不能直接操作winform上的控件的,因为默认的控件是在主线程上生成的,子线程是不能直接访问或者修改的,直接访问或者修改控件属性的话会报错。这个即使在Java上也是这样,Android中也经常被用到的。

这样的话,子线程岂不是没办法访问主线程生成的控件了,当然是否定的,有问题就用解决办法,微软的人更了解这一点,并且有好几种解决办法,主要的思路就是在子线程里,使用delegate代理一个主线程里面的方法。直接看代码:

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();
}

这样写的话,毫无疑问会报错,就是咱们上面说到的情况,子线程直接操作ui元素。我们对这个进行改造一下:

//声明一个委托类型,该委托类型无输入参数和输出参数
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);
}

这样的话就能执行成功了。在这里showDateTimethread.IsBackground = true;必须要加上。不知道大家注意没有,如果子线程里有 死循环(有时间必须用循环)或子线程在进行一个阻塞式的操作,如影响队列里的消息,那么不能主线程用什么方式终止子线程都没门,
  this.thread.Suspend();
  this.thread.Abort()
通通不管用,Abort() 方法也只是建议子线程终止,而不是无条件强行终目,这个不好,比如应用程序要退出,子线程结束不了会一直驻留内存exe都不会退出进程,有什么办法强行终止子线程哈,不要说类似于(不要用死循环,无意义之类的话,那对阻塞式的操作怎么说呢)
这一句的时候把线程阻死了 System.Messaging.Message m = q.Receive(); 
不管等多少,线程都是死的。

可以试试在退出的时候用
System.Environment.Exit(System.Environment.ExitCode);
Application.Exit();
还用在那些线程开始前,使用它的属性IsBackground,把它设为true,这样在你程序结束的时候,线程也会自动结束。

大家都知道随着linq和ef的流行,一个新的概念出现了,而且目前比较流行,那就是lambda,匿名函数,大家都知道,匿名函数可以用委托进行操作,可以说他是委托初始化的一种新的,便捷的形式,同样的道理,传统的委托必须得声明一个新的方法,才能使用委托,但是匿名函数,可以省去重新声明一个函数,直接看代码:

while (true)
{
//实例化一个委托变量,使用匿名方法构造
ProcessDelegate showProcess = delegate()
{label1.Text = "当前时间 " + DateTime.Now.ToString();
};
label1.Invoke(showProcess);
//线程暂停
Thread.Sleep(1000);
}

这样一来的话,简单明了,省去很多代码。

c#子线程调用主线程控件相关推荐

  1. Python GUI库TKinter子线程与主线程控件传递消息策略

    TKinter GUI库没有像MFC那样的强制安全策略,在MFC中子线程无法直接控制主线程中的GUI控件,比如修改文本框或者按钮上的内容.因为如果只有2个线程,即一个主线程和一个子线程的情况下子线程直 ...

  2. 模态对话框阻塞主线程的话不影响其他线程操作主线程控件(不阻塞)

    Task.Factory.StartNew(() => {Thread.Sleep(5000);this.Invoke(new Action(() => {this.button7.Tex ...

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

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

  4. handler回调主线程_Android使用Handler实现子线程与子线程、子线程与主线程之间通信...

    转载:https://blog.csdn.net/shaoenxiao/article/details/54561753 今天这篇文章只讲一下怎么使用Handler实现子线程与子线程之间.子线程与主线 ...

  5. C#跨线程调用窗体控件的问题

    前段时间遇到跨线程调用窗体控件的问题,其实一句话System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;就可以解决,但 ...

  6. Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信

    Python 多个线程按先后顺序执行,并保持各子线程和主线程的通信 摘要 最近有个项目使用pyqt5写的界面,界面展示部分作为项目的主线程,另外通过调用Thread,传入不同的参数又设置了五个子线程, ...

  7. Unity子线程与主线程交互(委托方式)

    Unity  Api无法从子线程访问, 但有些操作(例:IO存取文件)又必须子线程运行, 故实现在子线程做耗时操作, 完成后通知主线程更新状态 事件监听方式, 规避回调地狱:https://blog. ...

  8. Qt自定义事件实现及子线程向主线程传送事件消息

    近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...

  9. android Handler Message传递参数,handler子线程和主线程通讯

    创建Handler private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) { ...

最新文章

  1. [Security] Automatically adding CSRF tokens to ajax calls when using jQuery--转
  2. 成功解决Exception “unhandled ModuleNotFoundError“No module named ‘sklearn.neighbors.classification‘
  3. numpy基础(part6)--协方差与相关系数
  4. wordpress 显示数学公式 (MathJax-LaTeX)
  5. mesh渲染到ui_在Unity中使用UGUI修改Mesh绘制几何图形
  6. Rhel5 之NTP服务配置
  7. 当跨国企业女职业经理人遇上创业女 CEO,两者会擦出什么样的火花?
  8. bind 启动redis_详解Redis开启远程登录连接
  9. 服务器文档读取不了,服务器读取不到内存
  10. 责任分配矩阵和raci的区别_有限责任公司实现盈利,当年就一定可以分红吗?...
  11. 台电t30_这次我真的是服了,8000mA的T30续航力真心不虚
  12. Java线程状态以及 sheep()、wait()、yield() 的区别
  13. Neuralizing Regular Expressions for Slot Filling 神经网络转回自动机
  14. 包含漏洞-读写文件以及执行命令
  15. StataIC——短面板数据分析(以检验啤酒税将降低交通死亡率的假说为例)
  16. 创维数字--驱动开发岗位面试总结
  17. arcgis 线段合并
  18. matlab中在同一图形窗口中绘制出一个周期内的正弦曲线和余弦曲线,多选(3分) 在一个图形窗口同时绘制[0,2π]的正弦曲线、余弦曲线,可以使用命令( )。...
  19. 联想笔记本怎么找计算机放桌面,联想笔记本电脑便签在哪,笔记本电脑便签在哪里?...
  20. 苹果电脑切换任务管理器快捷键

热门文章

  1. 元宇宙技术在职业教育示范性虚拟仿真实训基地建设项目上的前景展望
  2. 微软云-Azure使用避坑宝典(1)
  3. 人人都会设计模式:07-建造者模式--Builder
  4. java 编写方法和属性,Java类属性及方法的定义
  5. vs2013 调用webapi出错,请求的资源不支持 http 方法“GET”
  6. 哈工大 编译原理 复习笔记
  7. 计算机毕业设计ssm基于SSM框架的股票交易系统3cwg3系统+程序+源码+lw+远程部署
  8. 2021-08-29 UML笔记
  9. C语言如何清除控制台特定的一行,及'\b'字符的使用
  10. 【廖雪峰】写一个验证Email地址的正则表达式