C#多线程问题:线程间操作无效: 从不是创建控件“label4”的线程访问它。

2025年02月12日 08:24
有3个网友回答
网友(1):

一楼正解

你是写在GuidProc这个类里面的,这个是不行的.必须写在Form的类中或者子类中.就是说:this.Invoke中的this必须指的是一个窗体对象.

补充:
原因:声明的委托需要参数.
private delegate void SetTextDelegate(string value);

解决:修改代码.

if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
object arg = (object)要传入的参数值
this.Invoke(d,arg);//这里参数不对。
}

网友(2):

这是线程安全的问题啊,C#中默认不允许在控件的非创建线程中设置控件的值。可以使用delegate解决。
给个例子吧,比如我要在另一个线程中设置一个textbox控件的值。调用下面的SetText()就不会抱错了。
private delegate void SetTextDelegate(string value);
private void SetText(string value)
{
if (this.InvokeRequired)
{
SetTextDelegate d = new SetTextDelegate(SetText);
this.Invoke(d);
}
else
{
this.textbox.Text = value;
}
}

把this.textbox.text = value; 改成 this.label4.text = value; 就可以用上面的函数设置你的label4的text了

你的delegate估计申明有问题.
上面不就是一个例子么,我测试过的,没有问题的阿

网友(3):

多个线程访问同一组件是不安全的,多以需要使用委托