C# 子线程访问主窗体控件
我用C#编写了一个主窗体,里面通过按钮控制打开一个新线程:privatevoidserverstart_Click(objectsender,EventArgse){th...
我用C# 编写了一个主窗体,里面通过按钮控制打开一个新线程:
private void serverstart_Click(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(Listen));
thThreadRead.Start();//启动线程
}
线程里面我想对主窗体中的Listbox进行操作(add添加数据),直接操作控件的话会出错,请问该怎么操作?
那么这个obj该如何创建呢?对不起,我有新手,又点笨,不是很清楚,能说详细点吗? 展开
private void serverstart_Click(object sender, EventArgs e)
{
thThreadRead = new Thread(new ThreadStart(Listen));
thThreadRead.Start();//启动线程
}
线程里面我想对主窗体中的Listbox进行操作(add添加数据),直接操作控件的话会出错,请问该怎么操作?
那么这个obj该如何创建呢?对不起,我有新手,又点笨,不是很清楚,能说详细点吗? 展开
6个回答
展开全部
是的,
在其他线程里,不允许调用主线程创建的控件~!!!!
这样做,是不安全的,因此,2.0屏蔽了这个~
楼上说的很对,用委托,具体代码如下~:
public delegate void MyInvoke(string str);
private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
//CheckForIllegalCrossThreadCalls = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}
private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}
在其他线程里,不允许调用主线程创建的控件~!!!!
这样做,是不安全的,因此,2.0屏蔽了这个~
楼上说的很对,用委托,具体代码如下~:
public delegate void MyInvoke(string str);
private void button9_Click(object sender, EventArgs e)
{
//_myInvoke = new MyInvoke(SetText);
//CheckForIllegalCrossThreadCalls = false;
Thread t = new Thread(new ThreadStart(fun));
t.Start();
}
private void fun()
{
//_myInvoke("dddd");
SetText("ddd");
}
private void SetText(string s)
{
if (textBox6.InvokeRequired)
{
MyInvoke _myInvoke = new MyInvoke(SetText);
this.Invoke(_myInvoke, new object[] { s });
}
else
{
this.textBox6.Text = s;
}
}
展开全部
在form声明中加上Control.CheckForIllegalCrossThreadCalls = false;
可以忽略控件得线程交叉引用错误
修改后如下:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
可以忽略控件得线程交叉引用错误
修改后如下:
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以创建一个listbox对象obj,obj赋值为主窗体中的listbox,在线程里判断obj 是否为null不是则可以使用.就不会出错.
在From类中添加
private System.Windows.Forms.ListBox obj;
在From 的Load事件中添加
obj=this.ListBox1(根据你的名称改变)
在线程中使用前用
if(obj!=null)
{
//有效才使用
}
在From类中添加
private System.Windows.Forms.ListBox obj;
在From 的Load事件中添加
obj=this.ListBox1(根据你的名称改变)
在线程中使用前用
if(obj!=null)
{
//有效才使用
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
.net 原则上禁止跨线程访问控件,因为这样可能造成错误的发生,推荐的解决方法是采用代理,用代理方法来间接操作不是同一线程创建的控件。
第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出错不敢保证Control.CheckForIllegalCrossThreadCalls = false;
第二种方法是禁止编译器对跨线程访问作检查,可以实现访问,但是出不出错不敢保证Control.CheckForIllegalCrossThreadCalls = false;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
整一个全局的变量用用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询