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

关于线程的初级有关问题

2011-12-19 
关于线程的初级问题.我希望当监听到新的链接消息后.增加客户数量.并反应到label标签中.现在出现如下问题:

关于线程的初级问题.
我希望当监听到新的链接消息后.增加客户数量.并反应到label标签中.
现在出现如下问题:
请求解决方案


                private   void   OpenServer()
                {
                        //开始监听
                        MyTcpListener   =   new   TcpListener(m_ipServerIP,   m_iPort);
                        MyTcpListener.Start();

                        //创建监听线程
                        m_trdServer   =   new   Thread(new   ThreadStart(ListenRun));
                        //启动线程
                        m_trdServer.Start();

                        bnServer.Text   =   "Close ";
                        bServer   =   true;
                }

             
                /*
                  *   labClientCnt是   label控件
                  *   //创建监听线程
                        m_trdServer   =   new   Thread(new   ThreadStart(ListenRun));
                        //启动线程
                        m_trdServer.Start();
                  *   */
                private   void   ListenRun()
                {
                        while   (bThread)
                        {
                                Socket   s   =   MyTcpListener.AcceptSocket();

                                SClient   tSClient   =   new   SClient(s,   m_altClients.Count);

                                m_altClients.Add(tSClient);

                                /*下面语句产生错误
                                  *   Cross-thread   operation   not   valid:  
                                  *   Control   'labClientCnt '   accessed  
                                  *   from   a   thread   other   than   the   thread  


                                  *   it   was   created   on
                                  *   */
                                labClientCnt.Text   =   m_altClients.Count.ToString();

                        }
                }

[解决办法]
private void ListenRun()
{
while (bThread)
{
.........................

Thread thread = new Thread( new ThreadStart(ChangeCall));
thread.Start();

}
}

private delegate void ChangeCallBack();
private void ChangeCall()
{
if (this.InvokeRequired)
{
ChangeCallBack callback = new ChangeCallBack(ChangeCall);
this.Invoke(callback, new object[] {});
}
else
{
labClientCnt.Text = m_altClients.Count.ToString();
}
}
[解决办法]
跨线程,移动,操作控件最简单的大概就是直接就System.Windows.Forms.Control根控件所带有的Invoke(Delegate d);方法了

热点排行