Задать вопрос
@Zulkund

Как обновлять ProgressBar в побочном потоке c#?

Зранее сорь, тема избита, но я не понимаю что нужно сделать.
Запускаю поток:
private void button3_Click(object sender, EventArgs e)
        {
                ProgressBar.Maximum = listToCalc.Count;
                ProgressBar.Value = 0;
                ProgressBar.Step = 1;
                listOfWells.Clear();
                thread = new Thread(calc);
                thread.Start();
            }

И возникает ошибка!
public void calc()
        {
            for (int i = 0; i < listToCalc.Count; i++) {
                listOfWells.Add(new Well(listToCalc[i]));
                listOfWells[i].calcP();
                ProgressBar.PerformStep();  - Выскакивает исключение!
            }
        }

Исправьте пожалуйста в рабочей вариант. Всякие делегаты и диспетчеры просто не могу понять. Заранее спасибо!
  • Вопрос задан
  • 4069 просмотров
Подписаться 1 Оценить 2 комментария
Решение пользователя kykyryky К ответам на вопрос (3)
kykyryky
@kykyryky
В классе формы объявить объект типа IProgress и инициализировать, например в конструкторе:
IProgress<int> progress;

progress = new Progress((i) =>
             {
                 progressBar.Value = i;
             });


Немного переделать метод calc:
public Task calc(IProgress<int> progress)
{
return Task.Run(() =>
            {
            for (int i = 0; i < listToCalc.Count; i++) {
                listOfWells.Add(new Well(listToCalc[i]));
                listOfWells[i].calcP();
                progress.Report(i)
            }
            });
        }


В обработчике:
private async void button3_Click(object sender, EventArgs e)
        {
                ProgressBar.Maximum = listToCalc.Count;
                ProgressBar.Value = 0;
                ProgressBar.Step = 1;
                listOfWells.Clear();
                await calc();
            }

Как-то так попробуй. Мог скобку потерять, или еще что по мелочи.
Ответ написан
Комментировать