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();
}
}
} 展开
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();
}
}
} 展开
3个回答
展开全部
一楼正解
你是写在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);//这里参数不对。
}
你是写在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);//这里参数不对。
}
展开全部
这是线程安全的问题啊,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估计申明有问题.
上面不就是一个例子么,我测试过的,没有问题的阿
给个例子吧,比如我要在另一个线程中设置一个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估计申明有问题.
上面不就是一个例子么,我测试过的,没有问题的阿
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
多个线程访问同一组件是不安全的,多以需要使用委托
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询