Вы пройти через все усилия, чтобы начать отдельный поток для экрана-заставки, что означает, что у вас есть правильная идея. Проблема в том, что реализация немного выключена. Призыв к Thread.Sleep
фактически спит текущий поток, поэтому ваш основной поток пользовательского интерфейса полностью мертв около 5 секунд, абсолютно ничего не делая, когда он должен выполнять загрузку основной формы в фоновом режиме, пока отображается экран заставки , После того, как Thread.Sleep
вернется, вы вызываете Application.Run
, чтобы запустить основную форму, но к тому времени уже слишком поздно - заставка уже осталась до тех пор, пока код говорит об этом, и он закрывается.
Возможно, вы устранили проблему, переместив вызов на Thread.Sleep
на поток заставки, но это довольно уродливый и хакерский подход, если честно. Помимо неотъемлемых проблем со спящим потоком, реальная точка заставки (как вы сами уступаете) заключается в том, чтобы дать пользователю что-то визуально интересное и обнадеживающее, чтобы посмотреть, пока вы выполняете какую-то длительную задачу. Большинство пользователей не особенно , как заставки (хорошо, на самом деле, похоже, что большинство людей их ненавидят), но они, возможно, имеют цель, хотя и ограниченную. Когда вы используете что-то вроде Thread.Sleep
, эффективно заставляя ваш заставку выходить на экран, ничего не делая, вы просто вращаете циклы процессора и теряете время пользователя без причины. Они будут намного менее прощающими. Я уверен, что это, вероятно, не ваш план, но часто это заканчивается тем, что происходит.
Было бы неплохо, если бы вы могли показать экран заставки, пока вы делаете длинную проверку в то же время в фоновом режиме? Действительно, это «правильная» реализация для экрана заставки, но очень сложно заставить его работать в самый раз. Синхронизация и кросс-потоки в коде пользовательского интерфейса сложнее писать и даже сложнее отлаживать.
Вместо этого я рекомендую вам плуть. Извлеките свой код, чтобы вручную отобразить экран заставки и все его угадывание Thread.Sleep
, а вместо этого замените его встроенной рамкой заставки. Большинство людей не знают об этом, потому что хитрые программисты Microsoft спрятали его под пространством имен Microsoft.VisualBasic
, где люди C# не могут его найти. Не позволяйте этому обмануть вас. Он отлично работает с приложениями C# и делает вашу жизнь намного проще. Почему эти ребята из VB.NET должны собрать все хорошие вещи для себя?
Эта структура будет обрабатывать все для вас автоматически, все, что вам нужно сделать, это предоставить ему класс формы заставки (который у вас уже есть, с именем frmSplashScreen
). Вы можете найти полные инструкции по его использованию в my answer here, включая пример кода.
Просто предложение, и простите меня, если это глупо, но это суббота, и я дома и просто проснулся, но ... Вы не могли бы назвать Application.Run (new frmMain()); из кода экрана Splash вместо кода Main(). Как раз перед этой.Close() строкой? – CMPerez
Посмотрите на этот ответ, чтобы преодолеть свое [закрытие заставки до завершения основного процесса] (http://stackoverflow.com/questions/13206926/vb-net-progressbar-backgroundworker/13486676#13486676) –