读书人

关于C#的线程安全,求救!该如何处理

发布时间: 2012-03-15 11:50:38 作者: rapoo

关于C#的线程安全,求救!
请问:线程每向一个控件传递数据,就要写一个invoke传递数据吗?
我现在有10个label,分别表示线程中不个不同数据的反馈,我该怎么办?同样的代码写10次吗?

C# code
        // 创建代理        delegate void setTextCallBack(String text);        //调用窗体中的invode函数传递参数        private void setText(String text)        {            if (this.label1.InvokeRequired)            {                setItemCallBack b = new setItemCallBack(setText);                this.Invoke(b, new object[] { text});            }            else            {                this.lable1.text = text;            }        }


为了能适合操作多个label,我增加了一个参数。
C# code
        // 创建代理        delegate void setTextCallBack(Label lbl, String text);        //调用窗体中的invode函数传递参数        private void setText(Label lbl, String text)        {            if (lbl.InvokeRequired)            {                setTextCallBack b = new setTextCallBack(setText);                this.Invoke(b, new object[] { text });            }            else            {                lbl.Text = text;            }        }



程序华丽的出错了 提示“参数计数不匹配”

[解决办法]
可以绕过这个问题
把要显示的数据封装到一个类中,
然后再调用,可以减少代码
你那样做是报错,呵呵this.Invoke只能传递一个参数
[解决办法]
可以在构造函数或者窗体Load的时候加这么一句

Control.CheckForIllegalCrossThreadCalls = False
[解决办法]
改一下参数就可以了:
C# code
  setTextCallBack b = new setTextCallBack(setText);  this.Invoke(b, new object[] { lbl, text });        //<-------
[解决办法]
楼上正解.添加一个参数就OK
[解决办法]
建议使用winapi sendmessage 函数,从线程中向窗口发送消息,也可以解决问题
[解决办法]
this.Invoke(b, new object[] { text });
-->
this.Invoke(b, new object[] { lbl, text });

怀疑楼主要么是粗心,要么就是不知道这个代码到底什么含义和功能才行,只是依葫芦画瓢,一改就出低级错误
[解决办法]
隐患就是有的时候可能界面控件显示与后台线程内容不一致,
这个是致命的。
可以考虑委托来做

读书人网 >C#

热点推荐