2013-03-12 2 views
2

У меня есть кусок кода, который получает доступные экземпляры сервера с моего SQL-сервера в DataTable. Это займет некоторое время, чтобы заполнить. Поэтому я попытался добавить индикатор выполнения, чтобы указать это время. Есть несколько способов сделать это:Пробег с таймером

1.Using фон рабочего
2.Using таймер

Я использовал таймер, но прогресс бар не анимировать.

мой код (WinForm):

private void frmCodeGenerator_Load(object sender, EventArgs e) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     tmrWaiting.Enabled = true; 
     tmrWaiting.Start(); 

     //List all available servers 
     PopulateServerInstances(); 
     //List all default namespaces to import 

     //Set the target folder default path tec. 

     tmrWaiting.Stop(); 
     Cursor.Current = Cursors.Default; 
    } 

private void tmrWaiting_Tick(object sender, EventArgs e) 
     {    
      pbWaiting.Value++; 
     } 

Курсор меняется форма нормально waitstate но прогресс бар не сделал. Я делаю это?

+0

Вы установили 'pbWaiting.Maximum'? – Nolonar

+0

Да. Из редактора свойств визуальной студии. 'pbWaiting.Maximum = 100' и' pbWaiting.Visible = true' – Irshad

+0

Какой INTERVAL вы используете? Если он слишком велик, возможно, он не стреляет к тому времени, когда задача завершилась? Кроме того, это будет просто подсчитываться независимо от фактического прогресса? Это просто фиктивный код? – Belogix

ответ

2

Ваш обработчик событий Load, который работает на вашем потоке пользовательского интерфейса, вызывает PopulateServerInstances, который, по-видимому, блокируется при загрузке данных. Вам нужно выполнить эту работу в потоке BG, чтобы ваш поток пользовательского интерфейса мог продолжать обновлять пользовательский интерфейс. BackgroundWorker - ваш лучший выбор, поскольку он включает в себя поддержку обновления информации о ходе работы в потоке пользовательского интерфейса по мере продвижения.

+0

Я не уверен в обработчике событий 'Load'. У меня есть Winforms, который выполняет большую часть своей работы в своем событии 'Load', и индикатор выполнения там работает просто отлично (хотя индикатор выполнения обновляется в фоновом потоке через делегат) – Nolonar

+0

в качестве дополнительного момента, ваша форма пока не будет заполнен метод заполнения. – fofik

+0

@Nolonar: это имело бы смысл, если вы периодически вызываете «Application.DoEvents()» для перекачивания всех событий пользовательского интерфейса или если ваш обработчик каким-то образом был перенаправлен в другой поток. –

Смежные вопросы