2010-06-10 2 views
1

Я использую Visual Studio 2010 и C# и пытаюсь показать свой прогрессбар, но он не работает.BackgroundWorker и Progressbar.Show()

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

Это то, что я делаю:

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(); 
    .... 
} 

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

благодаря свиданья Juergen

ответ

1

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

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

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

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

+0

Спасибо за помощь, ребята! Теперь это работает. Основная проблема заключалась в том, что я сделал это: Application.Run(); вместо этого: Application.Run (progressbarForm); И я вызываю progressbar из моего фона и его шоу! bye juergen – Juergen

1

Для того, чтобы информация о ходе работы с BackgroundWorker вам нужно вызвать ReportProgress метод из обработчика событий DoWork и показать прогресс в обработчик BackgroundWorker.ProgressChanged Event

+1

Также я думаю, вы должны установить свойство «ReportProgress» в «true». –

+0

Я также пробовал событие progresschanged. ничего не происходит. Но я хочу сначала показать свой прогрессбар, затем я хочу установить прогресс. – Juergen

+0

Я установил ReportProgress в true, и событие поднимается, но показ ничего не делает. – Juergen

2

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

+0

Это именно то, что я хочу сделать. , но я наблюдаю за файломChangedEvent. это не поднимается в основной теме. – Juergen

+0

Я делаю это: private void OnFileChanged (объект source, FileSystemEventArgs e) { // Если я покажу свой прогрессбар здесь, то ничего не происходит this.backgroundWorker.RunWorkerAsync(); } – Juergen

+0

Что вы подразумеваете под «ничего не происходит»? Попробуйте запустить фоновый рабочий стол BackgroundWorker.RunWorkerAsync(); и на следующей строке отобразится индикатор выполнения. –