首页 > 编程语言 >C#使用委托在Socket Udp端口侦听线程内更新主窗口控件显示

C#使用委托在Socket Udp端口侦听线程内更新主窗口控件显示

时间:2023-04-28 13:32:39浏览次数:34  
标签:控件 Udp Socket void text1 线程 new UI string


c#开启线程侦听Socket UDP端口,端口接收到网络读卡器的读卡数据后刷新UI界面显示接收数据,解析数据包信息并向读卡器发送显示文字、驱动读卡器播报语音、蜂鸣响声提示、开启继电器开关等操作。

C#使用委托在Socket Udp端口侦听线程内更新主窗口控件显示_c#socket


   .net 提示通过设置:CheckForIllegalCrossThreadCalls = false,可以在子线程内强制更新主窗口内控件值来刷新UI显示,但是这样使用有时会出现显示信息刷新不及时、造成显示卡顿、或软件直接奔溃等问题,有资料显示微软并不推荐使用这种子线程内强制刷新UI显示的,强烈建议使用委托的方式来刷新UI显示,代码如下:

定义好委托及传送参数:

delegate void Update1(string text1, byte[] bytes, int byteslen);   //UDP端口侦听线程内解析接收到的数据并更新UI委拖
delegate void Update2(string text1, string msg);                   //UDP端口侦听线程内更新UI委拖
复制代码

开启Socket Udp侦听端口并启动侦听线程:

private void StartListener()
        {
            IPEndPoint LocalPoint;
            PortNumber = Convert.ToInt32(textBox23.Text);
            while (!ready)
            {
                try
                {
                    LocalPoint = new IPEndPoint(IPAddress.Parse(localIp), PortNumber);
                    ListenerSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                    ListenerSock.Bind(LocalPoint);

                    ListenerThre = new Thread(new ThreadStart(ThrListener));
                    ListenerThre.Start();
                    ready = true;
                }
                catch
                {
                    ListenerSock.Close();
                    ready = false;
                    MessageBox.Show("有其它应用程序占用了 " + PortNumber.ToString() + " ,请检查并关闭此应用后再打开本程序", "警告", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    System.Environment.Exit(0);                      //这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
                }
            }
        }

        public void ThrListener()
        {
            while (ready)
            {
                try
                {
                    EndPoint RemotePoint = new IPEndPoint(System.Net.IPAddress.Any, 0);
                    byte[] bytes = new byte[1024];
                    int NumGet = ListenerSock.ReceiveFrom(bytes, ref RemotePoint);
                    RemoteIPoint = (IPEndPoint)RemotePoint;                                 //获取数据包来源IP及端口,原路回应

                    string dispstr = DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + (" FromIP:" + Convert.ToString(RemotePoint) + "          ").Substring(0, 30) + "Data:";
                    this.BeginInvoke(new Update1(EditUi1), dispstr, bytes, NumGet);        //通过委托传送参数显示接收到的数据包,并根据情况回应设备            
                }
                catch (Exception ex)
                {
                    this.BeginInvoke(new Update2(EditUi2), DateTime.Now.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss") + " ", ex.Message);   //通过委托传送参数显示接收到的数据            
                }
            }
        }
复制代码

委托更新UI显示

private void EditUi1(string text1, byte[] buf, int buflen)     //通过委托更新UI,数组传送参数
{            
            int i;
            string recestr = "";//接收数据显示

            for (i = 0; i < buflen; i++)
            {
                recestr = recestr + buf[i].ToString("X2") + " ";
            }
            
            ListItemAdd(text1 + recestr);
            
}
         
private void EditUi2(string text1, string Msg)     //通过委托更新UI,字符串传送参数
{
     ListItemAdd(text1 + Msg);
}

标签:控件,Udp,Socket,void,text1,线程,new,UI,string
From: https://blog.51cto.com/RongShi/6233917

相关文章

  • 认识HTML5的WebSocket
    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocketAPI。WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术。这个新的API提供了一个方法,从客户端使用简单的语法有效地推动消息到服务器。让我们看一看HTML5的WebSocketAPI:它可用于客户端、服务器......
  • Python3+WebSockets实现WebSocket通信
    一、说明1.1背景说明前段时间同事说云平台通信使用了个websocket的东西,今天抽空来看一下具体是怎么个通信过程。从形式上看,websocket是一个应用层协议,socket是数据链路层、网络层、传输层的抽像;从应用场合上看,websocket可以使用javascript实现,而socket不能用javascript实现(真......
  • Ant Design - 组件之 Tree树形控件
    AntDesign-组件之Tree树形控件针对tree树形组件封装了一个树形组件1.组件ui 2.组件名称ThemeCatalog 上面是image目录中的svg3.组件代码index.jsimportReact,{useEffect,useState}from'react';importPropTypesfrom'prop-types';importIcon,{Folde......
  • 界面控件DevExpress WinForm的垂直网格,让数据展示更灵活(二)
    DevExpressWinForm VerticalGrid(垂直网格)组件设计用于提供UI灵活性,它允许显示数据集中的单个行,或在其90度反向网格容器中显示多个数据集行。此外,开发者还可以将其用作属性网格,就像在VisualStudioIDE中找到的那样。PS:DevExpressWinForm拥有180+组件和UI库,能为WindowsForms......
  • js javascript js隐藏页面上有id的控件,隐藏页面上无控件包含的文字,控制页面控件属性
    1.隐藏页面上有id的控件varinput=document.getElementsByTagName("input");//获取页面所有inputfor(vari=0;i<input.length;i++){if(input.item(i).id.indexOf("txt")>=0)//判断input的id中是否包含txt字符串{......
  • c# winform Socket多文件传输并把传输文件保存到Oracle数据库Blob字段里
    服务器接收端代码:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.Net;usingSystem.Threading;usingSystem.......
  • MFC-Create动态创建列表视图控件
     BOOLbb=mylist.Create(LVS_SMALLICON|WS_DLGFRAME,rect,this,10001);//动态创建列表视图控件/*参数1:DWORDdwStyle列表视图控件的风格标准样式:LVS_ALIGNLEFT显示格式是大图标或小图标时,标签......
  • 界面控件DevExpress Blazor UI v22.2 - 支持.NET 7
    DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpressDashboardeXpressApp框架、适用于VisualStudio的CodeRush等一系列辅助工具,该组件拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应用提供直观的解决方案,全面解决各种使用场......
  • C# WinForm线程里操作控件
    做winform程序,避免不了的要在线程里控制窗体上的控件,直接在子线程里操作控件会报错“线程间操作无效,从不是创建控件***的线程访问它”。解决方法:privatevoidForm1_Load(objectsender,EventArgse){Threadt1=newThread(t1_clock);t1.IsBackground=true;......
  • Swing日期时间控件
    概述Swing控件中没有日期时间选择控件,在gitee中下载了一个别人封装的日期时间选择弹窗控件。网址:https://gitee.com/mkk/jcalendarchooserMaven安装到本地仓库:#注意:windows下需在CMD窗口执行命令mvninstall:install-file-Dfile=C:/Users/gzw/Desktop/calendar.jar-DgroupId=co......