C# は委任を使用して、ソケット Udp ポート リスニング スレッドのメイン ウィンドウ コントロールの表示を更新します。

c# はソケット UDP ポートをリッスンするスレッドを開始します。ネットワーク カード リーダーからカード読み取りデータを受信した後、ポートは UI インターフェイスを更新して受信したデータを表示し、データ パケット情報を解析して表示テキストをカード リーダーに送信します。 、カードリーダーを駆動して、音声とビープ音のプロンプトをブロードキャストし、リレースイッチをオンにし、その他の操作を行います。

この例では、デバイスの紹介を使用します。

1. カードをスワイプした後、UDP プロトコルを介して、カード番号、マシン番号、その他の情報を指定されたリモート サーバーの IP およびポートにアップロードします。

2. リモート サーバーから送信された表示テキスト、ブザー音、TTS 中国語音声ブロードキャスト、スイッチ リレー、その他のコマンドを受信して​​応答します。

WIFI ワイヤレス ネットワーク RFID クラウド カード リーダー リモート ネットワーク スイッチ 物流ネットワーク NB-IoT4G カード リーダー - Taobao.com (taobao.com)

   .net は、CheckForIllegalCrossThreadCalls = false に設定すると、サブスレッドのメイン ウィンドウのコントロール値を強制的に更新して UI 表示を更新できることを示唆していますが、場合によっては表示情報の更新が間に合わず、表示が崩れる場合があります。質問ですが、一部のデータでは、Microsoft は、この種のサブスレッドを使用して 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); }


            

            

         



おすすめ

転載: blog.csdn.net/zhangjin7422/article/details/129101522