C # Экран загрузки / Тема потоков - PullRequest
0 голосов
/ 12 октября 2011

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

Анимированный GIF не движется, что обычно происходит потому, что основной поток занят, но яЯ проделал нить, выполняя работу, и не повезло, что анимация была воспроизведена.

Вот что у меня есть.

Thread CheckVersion = new Thread(new ThreadStart(VersionCheck));
this.Show(); //bring up the main form
this.BringToFront();
pCheckingVersions.Visible = true; //this contains the animated gif
Application.DoEvents(); //refresh ui so my box
CheckVersion.Start(); //start thread
CheckVersion.Join(); //wait for thread to exit before moving on
pDownloading.Visible = false;

Ответы [ 2 ]

3 голосов
/ 12 октября 2011

Проблема в том, что Thread.Join () будет блокировать вызывающий поток, пока поток, на котором вы ожидаете, не завершится.

Вместо этого вы должны использовать асинхронную модель для этого вида деятельности. BackgroundWorker был бы идеальным здесь:

class MyForm
{
  private BackgroundWorker _backgroundWorker;

  public Myform()
  {
    _backgroundWorker = new BackgroundWorker();
    _backgroundWorker.DoWork += CheckVersion;
    _backgroundWorker.RunWorkerCompleted += CheckVersionCompleted;

    // Show animation
    // Start the background work
    _backgroundWorker.DoWork();
  }

  private void CheckVersion()
  {
    // do background work here
  }

  private CheckVersionCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
    // hide animation
    // do stuff that should happen when the background work is done
  }
}

Это всего лишь примерный пример реализации, но похожий на тот, что я делал в прошлом.

2 голосов
/ 12 октября 2011

Вызов CheckVersion.Join () заставляет ваш поток пользовательского интерфейса ждать завершения потока CheckVersion, который блокируется.Это заставляет анимацию GIF приостанавливаться.

Попробуйте использовать класс BackgroundWorker и используйте событие RunWorkerCompleted, чтобы сообщить потоку пользовательского интерфейса, что фоновая операция выполнена.

...