Доступ к элементу управления формы из отдельного потока - PullRequest
13 голосов
/ 30 сентября 2011

Я практикуюсь по многопоточности и столкнулся с этой проблемой.Ситуация такова:

  1. У меня есть 4 индикатора выполнения в одной форме, одна для загрузки файла, одна для отображения статуса загрузки страницы и т. Д. *

  2. Я должен контролировать прогресс каждого ProgressBar из отдельного потока.

Проблема в том, что я получаю InvalidOperationException , в котором говорится

Недопустимая операция между потоками: доступ к элементу управления «progressBar1» осуществляется из потока, отличного от потока, в котором он был создан.

Я ошибаюсь в этом подходекто-нибудь подскажет как это реализовать?

Ответы [ 5 ]

41 голосов
/ 30 сентября 2011

A Control доступен только в потоке, который его создал - в потоке пользовательского интерфейса.

Вы должны сделать что-то вроде:

Invoke(new Action(() =>
{
    progressBar1.Value = newValue;
}));

Затем метод invoke выполняет указанный делегат в потоке пользовательского интерфейса.

13 голосов
/ 30 сентября 2011

Вы можете проверить флаг Control.InvokeRequired , а затем при необходимости использовать метод Control.Invoke .Control.Invoke принимает делегата, чтобы вы могли использовать встроенное действие .

public void UpdateProgress(int percentComplete)
{
   if (!InvokeRequired)
   {
      ProgressBar.Value = percentComplete;
   }
   else
   {
      Invoke(new Action<int>(UpdateProgress), percentComplete);
   }
}
9 голосов
/ 30 сентября 2011

Доступ к элементам пользовательского интерфейса возможен только в потоке пользовательского интерфейса.WinForms и WPF / Silverlight не разрешают доступ к элементам управления из нескольких потоков.

Обход этого ограничения можно найти здесь .

6 голосов
/ 05 августа 2016
 private void Form1_Load(object sender, EventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
    }

Может быть, это сработает.

2 голосов
/ 30 сентября 2011

Вам необходимо вызвать метод Invoke из потоков, не относящихся к пользовательскому интерфейсу, чтобы выполнить некоторые действия с формой и другими элементами управления.

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