C# Экран загрузки / Тема потоков

Перед загрузкой моей основной формы пользователь просит проверить наличие обновлений. Когда они нажимают "ОК", я показываю основную форму и создаю панель, которая содержит несколько ярлыков и графическое окно с анимированным 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 ответа

Решение

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

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

Проблема в том, что 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
  }
}

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

Другие вопросы по тегам