首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#多线程操作解决方法

2012-04-08 
C#多线程操作我有一个多线程操作的程序,主要实现功能是:点ScanButton这个按钮后,启用一个Timer,这个Timer

C#多线程操作
我有一个多线程操作的程序,主要实现功能是:点ScanButton这个按钮后,启用一个Timer,这个Timer执行UDP报文的监听,如果有机器回应,则将该机器的IP信息,加到listview的列表中,这个Timer执行10秒后,自动停止,并且有相应的进度条progressBar显示Timer的执行进度。

现在出现的问题是:点击按钮后,每次进度条都没有走完,进度条没有走完,是不是说明Timer没有执行规定的次数就结束了?不知道是什么问题,请高手看一下。


ScanButton点击响应代码如下:

C# code
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执行的回调函数如下(其中操作了列表控件listview和进度条控件progressBar):
C# code
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);                 }


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

C# code
        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);        }





[解决办法]
用一个变量来做标示,应可以实现你要的想法








泰安二手房
[解决办法]
弄个计数的标志。先不必纠结进度条什么的,保证操作是对的再研究UI对不对。

热点排行