C#这个地方的线程出错是怎么回事

[复制链接]
查看11 | 回复3 | 2010-5-12 16:33:23 | 显示全部楼层 |阅读模式
public void Listen()

{

try

{

tlTcpListen = new TcpListener(port);

//以8000端口号来初始化TcpListener实例

tlTcpListen.Start();

//开始监听网络的连接请求

statusBar1.Text = "正在监听...";//******

stRead = tlTcpListen.AcceptSocket();
-----------------------------
private void button1_Click(object sender, EventArgs e)

{

try

{

thThreadRead = new Thread(new ThreadStart(Listen));

//以Listen过程来初始化Thread实例

thThreadRead.Start();

//启动线程

button1.Enabled = false;

}

catch

{

}

}
会报下面的错误
其他信息: 线程间操作无效: 从不是创建控件“statusBar1”的线程访问它。
这是怎么回事
我对线程的理解还不太透彻 是不是每个控件都会有个线程在管理如果另个一线程去改变这个控件线程内的东西就会报错 以上纯属猜测 谁能给一个正确的解释谢谢
每个控件都会有个线程在管理这句话对吗
还有这个程序生成exe文件后打开exe文件进行操作就不会报错了这是为什么

回复

使用道具 举报

千问 | 2010-5-12 16:33:23 | 显示全部楼层
因为你在线程里使用了控件,控件都是在主线程中的,所以需要写委托statusBar1.Text = "正在监听..."; //线程中这里使用了控件 针对你的这个程序委托这样写:private delegate void myDelegate(string str); private void setRich(string str)
{
if (this.statusBar1.InvokeRequired)
{
myDelegate md = new myDelegate(this.setRich);

回复

使用道具 举报

千问 | 2010-5-12 16:33:23 | 显示全部楼层
因为statusBar1不是你另外创建的线程里创建的控件,你不能在线程里面对它的Text属性进行修改!建议你的这句statusBar1.Text = "正在监听...";放在button1_Click事件里面,不要放在方法里面!只要你方法里面不关系到别的控件的值或者其他什么属性设置的修改应该不会报错!
回复

使用道具 举报

千问 | 2010-5-12 16:33:23 | 显示全部楼层
在线程中不能访问控件的应该在线程中使用Invoke
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行