DrFreez
@DrFreez

Почему в C# не получается обратиться к ToolStripProgressBar из потока?

Map.Paint рисует N изображений. Необходимо отобразить прогресс этой операции. Во время каждой итерации в Map.Paint создается событие. Вешаю на него обработчик, который вызывает BW.ReportProgress() и получаю эксепшен:
System.Windows.Forms Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'Form1' не из того потока, в котором он был создан.

Если BW.ReportProgress() вызывать прямо из BW_DoWork(), то всё ОК. Как быть?

PS. Проблема почему-то только с ToolStripProgressBar, а вот в ToolStripStatusLabel текст спокойно ставится

private void BW_DoWork (object sender, DoWorkEventArgs e) {
            string ImgSavePath = SavePath + "\\" + DB.TimeStart.ToString("yyyy-MM-dd HH-mm");

            Mapper Map = new Mapper(TimeStart, TimeEnd);
            Map.SaveImageEventHendler += new MapperEventHandler(OnSaveImageHandler);
            Map.Paint(ImgSavePath);
        }

        private void OnSaveImageHandler (object sender, MapperEvent e) {
            StatusBarMessage.Text = "Create map for " + e.Time.ToString("yyyy-MM-dd HH:mm");
            BW.ReportProgress(e.QueueValue * e.QueueSize / 100);
        }

        private void BW_ProgressChanged (object sender, ProgressChangedEventArgs e) {
            StatusBarProgress.Value = e.ProgressPercentage;
        }
  • Вопрос задан
  • 1528 просмотров
Пригласить эксперта
Ответы на вопрос 2
yarosroman
@yarosroman Куратор тега C#
C# the best
StatusBarProgress.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(()=>StatusBarProgress.Value = e.ProgressPercentage))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы