在线程执行中为标签设置新值

时间:2011-10-17 19:30:43

标签: c# .net winforms multithreading

有可能吗?我需要例如,在线程执行中为标签设置新值 我试过这个:

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'从其创建的线程以外的线程访问。

我是怎么做到的?提前谢谢!

5 个答案:

答案 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)

使用delegate

在新主题中调用anonymous method
this.Invoke((MethodInvoker) delegate {
    labelX.Text = msg;
});

答案 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。在报告进度中,更改标签值。