C#线程中访问控件

本文展示了在C#中如何在线程中安全地访问和操作ListView控件,包括清空列表项、发送接收数据及更新列表内容的方法。通过InvokeRequired检查并使用委托确保UI线程同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码片段

private void ClearListViewItem(ListView listView)
        {
            if (listView.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { ClearItem(listView); }));
            }
            else
            {
                ClearItem(listView);
            }
        }


        private void ClearItem(ListView listView)
        {
            listView.Items.Clear();
        }



完整使用

 private byte[] SendAndRecive(string IP, int Port, byte[] SendBuf)
        {
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress myIP = IPAddress.Parse(IP);
            int port = int.Parse(txbPort.Text.Trim());
            IPEndPoint end = new IPEndPoint(myIP, Port);
            socket.Connect(end);
            socket.Send(SendBuf);
            byte[] RecBuf = new byte[socket.ReceiveBufferSize];
            int reciveLength = socket.Receive(RecBuf);
            RecBuf = RecBuf.Take(reciveLength).ToArray();
            socket.Close();
            return RecBuf;
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            Task task = new Task(() => StartShow());
            task.Start(); 
        }


        private void StartShow()
        {
            while (true)
            {
                ShowData();
                Thread.Sleep(1000);
            }
        }
        
        private void ShowData()
        {
            int i = 0;
            try
            {
                //  001B00000006010307D0004E
                byte[] sendBuf = new byte[] { 0x00, 0x1B, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x07, 0xD0, 0x00, 0x4E };
                byte[] recBuf = SendAndRecive(txbIP.Text.Trim(), int.Parse(txbPort.Text.Trim()), sendBuf);
                 
                ClearListViewItem(lvResult);
                string[] ShortName = new String[] { "Ua", "Ub", "Uc", "Ia", "Ib", "Ic" };


                for ( i = 0; i < (int)recBuf[8]/4; i++)
                {
                    ListViewItem lvi = new ListViewItem();
                    lvi.Text = (i + 1).ToString();
                    lvi.SubItems.Add("");
                    string Value = recBuf[i * 4 + 11].ToString("X2") + recBuf[i * 4 + 12].ToString("X2") + recBuf[i * 4 + 9].ToString("X2") + recBuf[i * 4 + 10].ToString("X2");
                    lvi.SubItems.Add((TFunction.StrToLong(Value) * 0.0001).ToString()); 
                    AddListViewItem(lvResult, lvi);
                }
            }
            catch
            {
            }
        }




        private void ClearListViewItem(ListView listView)
        {
            if (listView.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { ClearItem(listView); }));
            }
            else
            {
                ClearItem(listView);
            }
        }


        private void ClearItem(ListView listView)
        {
            listView.Items.Clear();
        }


        private void AddListViewItem(ListView listView,ListViewItem item)
        {
            if (listView.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(delegate { AddItem(listView,item); }));
            }
            else
            {
                AddItem(listView, item);
            }
        }


        private void AddItem(ListView listView,ListViewItem item)
        {
            listView.Items.Add(item);
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值