• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C#使用代理实现线程间调用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

实现功能:

后台线程改变窗体控件(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(1000 * time);// 间隔1秒刷新页面
                }
            });
            threadStatus.Start();
        }

        private Color GetBackColor(string status)
        {
            if (status == "0")
            {
                return Color.Silver;// 灰色
            }
            else if (status == "1")
            {
                return Color.LawnGreen;// 绿色
            }
            else if (status == "2")
            {
                return Color.Gold;// 黄色
            }
            else if (status == "3")
            {
                return Color.Orange;// 橙色
            }
            else if (status == "4")
            {
                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);
            }
        }
    }
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#使用Topshelf创建Windows服务发布时间:2022-07-13
下一篇:
C#String前面不足位数补零的方法PadLeft发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap