установка нового значения для метки при выполнении потока - PullRequest
0 голосов
/ 17 октября 2011

это возможно?Мне нужно, например, установить новое значение для метки при выполнении потока.
Я пробовал это:

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;
                          }
                      }
                  }
              );
      }

Я получаю следующую ошибку:

Cross-недопустимая операция потока: управление 'labelX' осуществляется из потока, отличного от потока, в котором он был создан.

Как мне это сделать?Заранее спасибо!

Ответы [ 5 ]

4 голосов
/ 17 октября 2011

Вы должны вызвать его, чтобы убедиться, что поток пользовательского интерфейса (поток, создавший вашу метку) сделает это. Это просто, попробуйте следующее ...

    delegate void SetLabel(string msg);

    void SetLabelMethod(string msg)
    {
        labelX.text = msg;
    }


this.Invoke(new SetLabel(SetLabelMethod), new object { msg }); // this is your form
3 голосов
/ 17 октября 2011

Вызовите делегата в новой теме, используя анонимный метод :

this.Invoke((MethodInvoker) delegate {
    labelX.Text = msg;
});
1 голос
/ 18 октября 2011
labelX.Invoke(new Action(() => labelX.Text = msg));
0 голосов
/ 17 мая 2019

У меня тоже была эта проблема. В конце концов решено.

Не пытайтесь делать все в текстовом поле, а просто подумайте о сообщении, которое вы хотите отправить в текстовое поле.

МОЙ КОД:

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;
0 голосов
/ 22 октября 2012

Вы можете использовать background worker. В ходе выполнения отчета измените значение метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...