Наша программа работает нормально, пока кто-нибудь не заблокирует компьютер или не появится экранная заставка (но не ctrl + alt + delete ) . Как только компьютер разблокирован / экранная заставка закрыта, приложение перестает рисовать все, кроме строки заголовка, и перестает реагировать на ввод - оно отображает в основном белое окно, которое нельзя переместить или закрыть.
(Пример зависания приложения - горы на фоне моего рабочего стола)
Если оставить его на 5-10 минут, оно оживает и больше не зависает (даже после блокировка всплывающего окна компьютера / заставки) до перезапуска приложения.
Сложно отлаживать, потому что этого не происходит при запуске программы из Visual Studio, а только при ручном открытии .exe.
Это происходит только тогда, когда отображается экран-заставка - если я удалю код для отображения экрана-заставки, это перестанет происходить. Однако нам нужен экран-заставка.
Я пробовал все предложения на этой странице ; единственное, с чем этого не происходит, - это использование Microsoft.VisualBasic.WindowsFormsApplicationBase
, но это вызывает всевозможные других проблем.
Информация об этом в Интернете кажется скудной - сталкивался ли кто-нибудь раньше с подобной проблемой?
Вот соответствующий код:
//Multiple programs use this login form, all have the same issue
public partial class LoginForm
where TMainForm : Form, new()
{
private readonly Action _showLoadingForm;
public LoginForm(Action showLoadingForm)
{
...
_showLoadingForm = showLoadingForm;
}
private void btnLogin_Click(object sender, EventArgs e)
{
...
this.Hide();
ShowLoadingForm(); //Problem goes away when commenting-out this line
new TMainForm().ShowDialog();
this.Close();
}
private void ShowLoadingForm()
{
Thread loadingFormThread = new Thread(o => _showLoadingForm());
loadingFormThread.IsBackground = true;
loadingFormThread.SetApartmentState(ApartmentState.STA);
loadingFormThread.Start();
}
}
Вот пример одного из _showLoadingForm
действия, используемые в одной из программ:
public static bool _showSplash = true;
public static void ShowSplashScreen()
{
//Ick, DoEvents! But we were having problems with CloseSplashScreen being called
//before ShowSplashScreen - this hack was found at
//https://stackoverflow.com/questions/48916/multi-threaded-splash-screen-in-c/48946#48946
using(SplashForm splashForm = new SplashForm())
{
splashForm.Show();
while(_showSplash)
Application.DoEvents();
splashForm.Close();
}
}
//Called in MainForm_Load()
public static void CloseSplashScreen()
{
_showSplash = false;
}