关闭

C#子线程中进行UDP报文的监听

标签: c#listviewtimerbyteobjectstring
1589人阅读 评论(1) 收藏 举报
分类:

这两天,在改一个程序,程序的主要功能是:

1. 点击ScanButton按钮,触发事件,发送广播报文

2. 开启一个子线程,进行UDP报文监听,如果接收到符合格式的报文,则做相应的处理

3. 10秒后,子线程停止UDP报文监听


ScanButton点击响应代码如下:

private void ScanButton_Click(object sender, EventArgs e)
        {
            byte[] buffer = new byte[] { 0x55, 0x01, 0xAA };

            

            var tes = new TimerState();
            var listenDelegate = new TimerCallback(BeginListen);
            var timer = new System.Threading.Timer(listenDelegate, tes, 10, 1000);
            tes.Tmr = timer;
}

采用一个Timer来新建一个UDP监听线程,Timer执行的回调函数如下(其中操作了列表控件listview和进度条控件progressBar):

private void BeginListen(object o)
        {
            var ts = (TimerState)o;
            ts.Counter++;

            if (ts.Counter == 101)
            {
                ts.Tmr.Dispose();
                ts.Tmr = null;
            }
            
           
                
                byte[] data ;
                data = udpRec.Receive(ref iep);
                if (data.Length == 11 && data[0] == 0x55 && data[1] == 0x01 && data[10] == 0xaa)
                {
                    string ip = data[2].ToString() + "." + data[3].ToString() + "." + data[4].ToString() + "." + data[5].ToString();
                    string netmask = data[6].ToString() + "." + data[7].ToString() + "." + data[8].ToString() + "." + data[9].ToString();

                    ListViewItem _item = new ListViewItem();
                    _item.SubItems[0].Text = ip;
                    _item.SubItems.Add(netmask);


                    UpdateListviewDelegate d_listview = new UpdateListviewDelegate(UpdateListview);
                    listView1.Invoke(d_listview, _item);
                    
                }

                UpdateProgressBarDelegate d_progressbar = new UpdateProgressBarDelegate(UpdateProgressBar);
                progressBar.Invoke(d_progressbar, ts.Counter);
         
        }

相应的关于列表控件与进度条控件的回调函数

 delegate void UpdateProgressBarDelegate(int value);
        private void UpdateProgressBar(int value)
        {
            
            progressBar.Value = value;
            
        }

        delegate void UpdateListviewDelegate(ListViewItem item);
        private void UpdateListview(ListViewItem item)
        {
            
            if (!isExist(item))
                listView1.Items.Add(item);
        }

然而,程序总是达不到理想的效果,一直以为是多线程的编程出错了

后来发现,原来是

 data = udpRec.Receive(ref iep);
这条语句阻塞了,因为如果这条语句如果接收不到报文,就会一直停下来,不会执行后续代码。



修改的方法:


判断

if(udpRec.Client.Available>0)

说明此时有报文,则调用

 data = udpRec.Receive(ref iep)




0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16593次
    • 积分:324
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:1篇
    • 译文:0篇
    • 评论:4条
    最新评论