BackgroundWorker и Progressbar.Show () - PullRequest
1 голос
/ 10 июня 2010

Я использую Visual Studio 2010 и C # и пытаюсь показать мой индикатор выполнения, но он не работает.

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

Вот что я делаю:

static void Main(string[] args) {
  ProgressForm form = new ProgressForm();
  new FileWatcher(form).Start();
  Application.Run();
}

ProgressForm:
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
private void bgWorker_DoWork(object sender, DoWorkEventArgs e) {
  this.Show();
  ....
}

но ничего не показывает.Почему это не работает?

спасибо, пока Юрген

Ответы [ 3 ]

2 голосов
/ 10 июня 2010

Вы не должны изменять фоновые потоки формы пользовательского интерфейса. Это должно быть сделано только из основного потока. Вы можете отобразить базовый индикатор выполнения непосредственно перед запуском фонового работника и скрыть его в обработчике событий RunWorkerCompleted в фоновом режиме. Чтобы сообщить о реальном прогрессе, вам нужна реализация, как предложил Giorgi.

1 голос
/ 10 июня 2010

Нельзя использовать BGW для отображения формы, поскольку у потока нет нужного состояния. Вам нужно будет использовать Thread, чтобы вызвать его метод SetApartmentState (), чтобы переключить его на STA. Вам также нужен цикл сообщений в потоке, чтобы сохранить форму активной, что требует вызова Application.Run (). И форма должна быть создана в этой теме. Таким образом:

        var t = new Thread(() => Application.Run(new Form1()));
        t.SetApartmentState(ApartmentState.STA);
        t.Start();

Одна большая проблема с этой формой состоит в том, что она не может принадлежать ни одному окну в вашем потоке пользовательского интерфейса. Придав ему тенденцию исчезать за окном другого приложения. Кроме того, ваш поток пользовательского интерфейса все еще не работает, его окна будут появляться с сообщением «Не отвечает» в строке заголовка через несколько секунд.

Правильный способ сделать это - наоборот: запустить трудоемкий код в другом потоке, BGW был бы очень хорошим выбором. Поток пользовательского интерфейса должен отображать вашу форму прогресса. BackgroundWorker.ReportProgress идеально подходит для обновления индикатора выполнения.

1 голос
/ 10 июня 2010

Чтобы сообщить о прогрессе из BackgroundWorker, вам нужно вызвать метод ReportProgress из обработчика событий DoWork и показать прогресс в обработчике BackgroundWorker.ProgressChanged Event

...