关于线程的初级问题.
我希望当监听到新的链接消息后.增加客户数量.并反应到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);方法了