Как решить проблему «Операция с несколькими потоками недействительна»? - PullRequest
1 голос
/ 19 июля 2010

У меня есть диалоговое окно с формами окон, где выполняется более длинная операция (асинхронная) в задании backgroundworker Во время этой операции я хочу изменить некоторые значения в форме (метки, ...).Но когда фоновый работник пытается что-то изменить в форме, я получаю сообщение об ошибке " Операция с несколькими потоками недопустима "!Как решить эту проблему?

Ответы [ 4 ]

3 голосов
/ 19 июля 2010

Вызовите метод ReportProgress из рабочего и обработайте ProgressChanged для обновления текущего состояния.

2 голосов
/ 19 июля 2010

Проверьте, требуется ли вызов, затем вызовите BeginInvoke.

private void AdjustControls()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new MethodInvoker(this.AdjustControls));
            }
            else
            {
                label1.Text = "Whatever";
            }
        }
1 голос
/ 19 июля 2010

Вы не можете изменять элементы управления непосредственно внутри потока, который их не создавал. Вы можете использовать метод invoke, как показано выше, или использовать событие BackgroundWorker ProgressChanged.

Код, используемый внутри BackgroundWorker DoWork:

myBackgroundWorker.ReportProgress(50); // Report that the background worker has got to 50% of completing its operations.

Код, используемый внутри BackgroundWorker ProgressChanged:

progressBar1.Value = e.ProgressPercentage; // Change a progressbar on the WinForm
1 голос
/ 19 июля 2010

Я чувствую себя немного странно, говоря здесь о своем собственном роге, но вы можете найти какое-то применение в библиотеке ThreadSafeControls , которую я написал именно для этой цели.

...