【问题标题】:setting new value to an label in thread execution在线程执行中为标签设置新值
【发布时间】:2011-10-17 19:30:43
【问题描述】:

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

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

我该怎么做?提前致谢!

【问题讨论】:

标签: c# .net winforms multithreading


【解决方案1】:

您必须调用它以确保 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

【讨论】:

    【解决方案2】:

    在您的新线程中调用delegate,使用anonymous method

    this.Invoke((MethodInvoker) delegate {
        labelX.Text = msg;
    });
    

    【讨论】:

      【解决方案3】:
      labelX.Invoke(new Action(() => labelX.Text = msg));
      

      【讨论】:

        【解决方案4】:

        我也有这个问题。终于解决了。

        不要试图在文本框中做所有事情,而只是想你想发送到文本框的 Msg。

        我的代码:

        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;
        

        【讨论】:

          【解决方案5】:

          您可以使用background worker。在报告进度中,更改标签值。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多