有可能吗?我需要例如,在线程执行中为标签设置新值 我试过这个:
private void button1_Click_1(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(DoWork));
th.Start();
}
public void DoWork()
{
while (true)
{
StartSearch(path, ref httpRequest);
}
}
public void StartSearch(string path, ref HttpWebRequest httpRequest) {
foo.GetTopic(path, delegate(string post, string name, string uid)
{
{
if (post.Contains("<font color=\"#0000FF\">"))
{
string msg = string.Format("Post:{0}\r\nby {1}({2})", post, name, uid);
//MessageBox.Show(msg);
labelX.text = msg;
}
}
}
);
}
我收到以下错误:
跨线程操作无效:控制'labelX'从其创建的线程以外的线程访问。
我是怎么做到的?提前谢谢!
答案 0 :(得分:4)
您必须调用它以确保ui线程(已创建标签的线程)执行此操作。它很容易,尝试以下......
delegate void SetLabel(string msg);
void SetLabelMethod(string msg)
{
labelX.text = msg;
}
this.Invoke(new SetLabel(SetLabelMethod), new object { msg }); // this is your form
答案 1 :(得分:3)
答案 2 :(得分:1)
labelX.Invoke(new Action(() => labelX.Text = msg));
答案 3 :(得分:0)
我也有这个问题。最终解决了。
不要尝试在文本框中执行所有操作,而要考虑要发送到文本框的消息。
我的代码:
private delegate void _deleSetMesssage(string msg);
public void SetMessage(string msg)
{
if (this.InvokeRequired)
{
_deleSetMesssage method = new _deleSetMesssage(SetMessage);
this.Invoke(method, new object[] { msg });
}
else
{
this.label1.Text = msg;
}
}
不是首选方法:
CheckForIllegalCrossThreadCalls = false;
答案 4 :(得分:-1)
您可以使用background worker
。在报告进度中,更改标签值。