日期:2014-05-18  浏览次数:20866 次

都来分析一下-- --线程间操作无效的原因

昨天刚学Socket,遇到问题,至今没有整明白。请各位高手帮忙。

我是用异步来处理
socket.BeginAccept(....)
socket.BeginReceive(...)
。。。。。

我在服务器端 将 多个客户端多次发送的数据 显示到一个TextBox 中时,

报了一个错误:
线程间操作无效: 从不是创建控件“textBox1”的线程访问它。

请大家帮我分析一下产生这个错误的原因。

------解决方案--------------------
探讨
这个原因天天有人问。
在 WinForm中,每个控件创建时都会隶属于一个相应的进程,这个进程有一个ID。
而你如果在另外一个进程中去访问它是,就会产生这个错误了。
解决的方法大体是两个:
1:设置

C# codeForm.CheckForIllegalCrossThreadCalls = false;


系统将不进行这项检查。

2:使用Invoke调用委托。
Invoke将在创建这个控件的线程中调用相应委托。

------解决方案--------------------
对于你的情况我可以想像一下大体的操作是这样的:
C# code

private delegate void ChangeText(string t);
//这是附加一段文本的
public void AppendText(string t)
{
    if(textBox1.InvokeRequired)
    {
        ChangeText ct = new ChangeText(AppendText);
        this.Invoke(ct,new object[]{t});
        return;
    }
    textBox1.Text += t;
}
//这是完全重设文本的
public void SetText(string t)
{
    if(textBox1.InvokeRequired)
    {
        ChangeText ct = new ChangeText(SetText);
        this.Invoke(ct,new object[]{t});
        return;
    }
    textBox1.Text = t;
}

------解决方案--------------------
顶,