日期:2014-05-19  浏览次数:20721 次

线程之间互相 访问的问题!!!
我   一个函数   是   TCP操作的类,
有一个   事件是   接收!!
因为用的是异步的,所以不用自己控制线程,但接收里面也相当与内部的一个线程了。
在这个线程里面,我操作   WINDOWS控件,给控件属性赋值,抱错误说

线程间操作无效:   从不是创建控件“XXX”的线程访问它。
不能   改他的值!

但我以前的代码好用,同样在线程里给WIN控件   修改值,但现在这个代码和以前的一个性质,同样是   在线程序里   修改控件值,但就不好用了?真不明白,以前也是,写有些工程的时候就   可以在线程里修改,写有些的时候就必须用委托封送。请问具体差在哪?不管他安全不安全的

要   不能操作就全不能操作,如果能操作就全能操作,弄了个   有时候好用有时候不好用真让人不知道怎么回事?
到底差在哪请问?     以前2003里有时候能修改,有时候不能修改。服了。


------解决方案--------------------
2003的可以,但是2005的不行
两个解决办法:
用委托,给个示例:
delegate void SetTextCallback(string text);建立委托

private void SetText(string text)
{
if (this.listBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.listBox1.Items.Add(text);
}
}

private void Accp()
{
try
{
MyServer = new IPEndPoint(myIp, Int32.Parse(textBox2.Text));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(MyServer);
sock.Listen(50);
SetText( "主机: " + textBox1.Text + "端口: " + textBox2.Text + " 开始监听。。。\r\n ");
while (true)
{
accsock = sock.Accept();
if (accsock.Connected == true)
{

SetText( "与客户端建立连接 "); //线程间操作listBox~
Thread thread = new Thread(new ThreadStart(Round));
thread.Start();
}
}
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}

或者在窗体的构造函数里这样写一句:CheckForIllegalCrossThreadCalls = false;
------解决方案--------------------
CheckForIllegalCrossThreadCalls = false;
加在哪里?