Наша программа работает нормально, пока кто-то не закроет компьютер или не закроется экранная заставка (но не 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<TMainForm>
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
///info/93370/multi-threaded-splash-screen-in-c48946#48946
using(SplashForm splashForm = new SplashForm())
{
splashForm.Show();
while(_showSplash)
Application.DoEvents();
splashForm.Close();
}
}
//Called in MainForm_Load()
public static void CloseSplashScreen()
{
_showSplash = false;
}