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

程序的意思就是2个按钮,一个开始,一个停止。点开始按钮,程序抛出一个线程,计算2个GUID的值并在Label上显示,点停止线程结束。namespaceGUIDTEST{p... 程序的意思就是2个按钮,一个开始,一个停止。点开始按钮,程序抛出一个线程,计算2个GUID的值并在Label上显示,点停止线程结束。
namespace GUIDTEST
{
public partial class Form1 : Form
{
Thread t;
public Form1()
{
InitializeComponent();
t = new Thread(new ThreadStart(GuidProc));
}

private void button2_Click(object sender, EventArgs e)
{
t.Suspend();
}

private void button1_Click(object sender, EventArgs e)
{
t.Start();
}
public void GuidProc()
{
int i = 0;
while (true)
{
string s1 = Guid.NewGuid().ToString();
label4.Text = s1;
label4.Refresh();
string s2 = Guid.NewGuid().ToString();
label5.Text = s2;
label5.Refresh();
i++;
label6.Text = i.ToString();
}
}
}
}
调试失败。
真是不好意思,麻烦各位了,我是这么写的,老说参数不对。VS 2008
public partial class Form1 : Form
{
Thread T;
public Form1()
{
InitializeComponent();
T = new Thread(new ThreadStart(GuidProc));
}

private void button1_Click(object sender, EventArgs e)
{
T.Start();
}
private delegate void SetLabelText(string value);
private void SetLabel1(string value)
{
if (this.InvokeRequired)
{
SetLabelText d = new SetLabelText(SetLabel1);
this.Invoke(d);//这里参数不对。
}
else
{
this.label1.Text = value;
}
}
private void GuidProc()
{
while (true)
{
SetLabel1(Guid.NewGuid().ToString());
label1.Refresh();
}
}
}
展开
 我来答
lcg1986
2008-10-08 · TA获得超过3374个赞
知道大有可为答主
回答量:1858
采纳率:90%
帮助的人:1619万
展开全部
一楼正解

你是写在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);//这里参数不对。
}
百度网友638b535
2008-10-07 · TA获得超过234个赞
知道小有建树答主
回答量:268
采纳率:0%
帮助的人:330万
展开全部
这是线程安全的问题啊,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估计申明有问题.
上面不就是一个例子么,我测试过的,没有问题的阿
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友6eed2f8
2008-10-06 · TA获得超过5082个赞
知道大有可为答主
回答量:3423
采纳率:0%
帮助的人:3816万
展开全部
多个线程访问同一组件是不安全的,多以需要使用委托
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式