«Операция с поперечной резьбой недопустима» Предупреждение - PullRequest
0 голосов
/ 25 апреля 2018

В моем приложении c # form я использую BackgroundWorker, но не смог изменить поле label1. Может ли кто-нибудь помочь мне в этом?

Спасибо.

private void goButton_Click(object sender, EventArgs e)    
{
    _worker = new BackgroundWorker();
    _worker.WorkerSupportsCancellation = true;
    _worker.DoWork += new DoWorkEventHandler((state, args) =>
    {
        do
        {
            if (_worker.CancellationPending)
                break;
            setlabel();
        } while (true);
    });

    _worker.RunWorkerAsync();
    goButton.Enabled = false;
    stopButton.Enabled = true;
}

private void setlabel()
{
    label1.Text = "test";
}

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы не можете обновлять элементы пользовательского интерфейса не из потока пользовательского интерфейса (в вашем случае в функции DoWork).Вы можете использовать BackgroundWorker ProgressChangedEventHandler для изменения состояния интерфейса в обратном вызове.

0 голосов
/ 25 апреля 2018

Вы не можете манипулировать элементами управления, которые были созданы в потоке пользовательского интерфейса из фонового потока.Для этого вы можете использовать метод BeginInvoke :

  if (_worker.CancellationPending)
        break;
   this.BeginInvoke(new Action(setlabel));

Метод:

Асинхронно выполняет указанный делегат в потоке, который обрабатывает базовый элемент управлениябыл создан на.

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