C# 使用代理实现线程间调用
实现功能:
后台线程改变窗体控件(flowLayoutPanel1)的状态。
利用 this.flowLayoutPanel1.InvokeRequired == false,可以知道是主线程调用的自己控件,还是其他线程调用。
如果其他线程调用就使用DisplayDelegate代理。
窗体初期化时要加,允许线程间调用:
CheckForIllegalCrossThreadCalls = false;
窗体加载时启动一个匿名线程threadStatus,循环监视clientList列表。如果列表中的数值改变则改变窗体控件的状态。
namespace XXXX
{
public partial class Frm_Manage : Form
{
// 客户端状态列表
Dictionary<string, SocketClientInfo> clientList;
// 线程间调用代理
private delegate void DisplayDelegate(string clientIp, string clientNum, string status);
// 心跳线程
public Thread threadStatus { set; get; } public Frm_Manage()
{
// 允许线程间调用
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
} private void Frm_Manage_Load(object sender, EventArgs e)
{
SocketServer Socketservice = SocketServer.GetInstance();
clientList = Socketservice.GetClientDictionary(); threadStatus = new Thread(() =>
{
while (true)
{
foreach (SocketClientInfo item in clientList.Values)
{
bool existFlg = false;
foreach (Control subPan in this.flowLayoutPanel1.Controls)
{
if (subPan.Name == item.clientIp)
{
// 存在该终端,改变显示状态
subPan.BackColor = GetBackColor(item.clientStatus);
existFlg = true;
break;
}
}
if (!existFlg)
{
// 不存在该终端,添加新控件
AddDisplay(item.clientIp, item.clientNum, item.clientStatus);
}
}
this.flowLayoutPanel1.Refresh(); Thread.Sleep( * time);// 间隔1秒刷新页面
}
});
threadStatus.Start();
} private Color GetBackColor(string status)
{
if (status == "")
{
return Color.Silver;// 灰色
}
else if (status == "")
{
return Color.LawnGreen;// 绿色
}
else if (status == "")
{
return Color.Gold;// 黄色
}
else if (status == "")
{
return Color.Orange;// 橙色
}
else if (status == "")
{
return Color.Red;// 红色
}
else
{
return Color.Silver;// 灰色
}
} private void AddDisplay(string clientIp, string clientNum, string status)
{
try
{
//如果调用该函数的线程和控件flowLayoutPanel1位于同一个线程内
if (this.flowLayoutPanel1.InvokeRequired == false)
{
//直接将内容添加到窗体的控件上
Panel pal = new Panel();
pal.Name = clientIp;
pal.Width = DisStatusW_PX;
pal.Height = DisStatusH_PX;
pal.BackColor = GetBackColor(status);
pal.Controls.Add(pic); this.flowLayoutPanel1.Controls.Add(pal);
}
//如果调用该函数的线程和控件flowLayoutPanel1不在同一个线程
else
{
//通过使用Invoke的方法,让子线程告诉窗体线程来完成相应的控件操作
DisplayDelegate disp = new DisplayDelegate(AddDisplay); //使用控件flowLayoutPanel1的Invoke方法执行Display代理(其类型是DisplayDelegate)
this.flowLayoutPanel1.Invoke(disp, clientIp, clientNum, status);
}
}
catch (Exception e)
{
LogHelper.WriteError(typeof(Frm_Manage), e);
}
}
}
}
C# 使用代理实现线程间调用的更多相关文章
- 线程间通信 GET POST
线程间通信有三种方法:NSThread GCD NSOperation 进程:操作系统里面每一个app就是一个进程. 一个进程里面可以包含多个线程,并且我们每一个app里面有且仅有一 ...
- 【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
背景 通过一个辅助线程计算出的一个值赋给textBox1.text: 解决办法 1.直接在窗体的构造函数中添加: System.Windows.Forms.Control.CheckForIllega ...
- 关于“线程间操作无效: 从不是创建控件’textBox1‘的线程访问它”异常的解决方法
线程间操作无效: 从不是创建控件“textBox1”的线程访问它 背景:通过一个辅助线程计算出的一个值赋给textBox1.text;解决办法:1.直接在窗体的构造函数中加:System.Window ...
- 从.NET 1.1 升级到.NET 4.0 遇到 线程间操作无效: 从不是创建控件 [XX] 的线程访问它.
有两种方式解决 1.在窗体构造函数中写Control.CheckForIllegalCrossThreadCalls =false;2.使用Invoke等委托函数 问题原因是 .NET2.0 以后拒绝 ...
- (转载)Java里快如闪电的线程间通讯
转自(http://www.infoq.com/cn/articles/High-Performance-Java-Inter-Thread-Communications) 这个故事源自一个很简单的想 ...
- Java中快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
- iOS开发之线程间的MachPort通信与子线程中的Notification转发
如题,今天的博客我们就来记录一下iOS开发中使用MachPort来实现线程间的通信,然后使用该知识点来转发子线程中所发出的Notification.简单的说,MachPort的工作方式其实是将NSMa ...
- wusir 线程间操作无效: 从不是创建控件“”的线程访问它 解决办法
利用FileSystemWatcher设计一个文件监控系统时,如果一个文件被修改或者新建,则文件修改事件会被多次触发而产生多条信息.为了将一个文件被修改一次而产生的多条信息归结为一条,在设计中新开了一 ...
- Java 里快如闪电的线程间通讯
这个故事源自一个很简单的想法:创建一个对开发人员友好的.简单轻量的线程间通讯框架,完全不用锁.同步器.信号量.等待和通知,在Java里开发一个轻量.无锁的线程内通讯框架:并且也没有队列.消息.事件或任 ...
随机推荐
- day1:注释和变量
1.注释的作用:对代码的解释,方便以后阅读代码 2.常用的快捷键:ctrl+q:notepad++的注释ctrl+/:pycharm的注释ctrl+c:复制ctrl+v:粘贴ctrl+z:撤销ctrl ...
- 1731: [Usaco2005 dec]Layout 排队布局*
1731: [Usaco2005 dec]Layout 排队布局 题意: n头奶牛在数轴上,不同奶牛可以在同个位置处,编号小的奶牛必须在前面.m条关系,一种是两头奶牛距离必须超过d,一种是两头奶牛距离 ...
- Ethical Hacking - GAINING ACCESS(19)
Client-Side Attacks - Social Engineering Tool: The FAT RAT Just like Veil, it generates Undetectable ...
- python监控服务器应用日志,推送钉钉机器人,实时关注日志异常
生产环境多台服务器上部署了多个应用,日志出现报错时,无法及时反馈到开发人员.部署一个大型的运维监控应用,不但耗资源,而且配置也不简单. 简简单单写个python脚本来监控服务器日志就简单多了,废话不多 ...
- javascript : 写一个类似于 jquery css() 的方法
我们知道,jquery css() 方法可以很方便的更改DOM的样式. 但从原理上,这个并不复杂,我们完全可以自己写一个. 上代码. updateDOMStyle(DOM, obj){ Object. ...
- 又被逼着优化代码,这次我干掉了出入参 Log日志
本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 最近技术部突然刮起一阵 review 代码的小风,挨个项目组过代码,按理说这应该是件挺好的事,让别人指出自己代码中的不足,查 ...
- 深入掌握K8S Pod
k8s系列文章: 什么是K8S K8S configmap介绍 Pod是k8s中最小的调度单元,包含了一个"根容器"和其它用户业务容器. 如果你使用过k8s的话,当然会了解pod的 ...
- 有关 Session 的那些事儿
原文链接: https://blog.by24.cn/archives/about-session.html Web 开发中,Session 是经常用到的概念,但是在日常交流中,似乎又经常引起误解. ...
- 京东阅读(web)体验优化
京东有电子书可以购买,可以多端阅读.比如PC客户端,移动端,以及本文提到的PC网站端. 先换个镜头,读书要记笔记(电子版本), 方便以后查阅. 镜头换回来,但是,我们为了方便肯定是想复制,下载啊,分享 ...
- web自动化 -- HTMLreport(一)测试报告自定义测试用例名,重写ddt
一.需求痛点 1.HTMLreport测试报告的用例名不明确 2.希望可以自定义HTMLreport测试报告的用例名 3.痛点截图 二.解决办法 1.原因分析 HTMLreport测试报告中的用例名是 ...