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
}
}
Это только грубый пример реализации, но похожий на тот, что я делал в прошлом.