Программа зависает после выхода из заставки или блокировки компьютера

Наша программа работает нормально, пока кто-нибудь не заблокирует компьютер или не появится экранная заставка (но не ctrl + alt + delete ) . Как только компьютер разблокирован / экранная заставка закрыта, приложение перестает рисовать все, кроме строки заголовка, и перестает реагировать на ввод - оно отображает в основном белое окно, которое нельзя переместить или закрыть.

Example of application freezing

(Пример зависания приложения - горы на фоне моего рабочего стола)

Если оставить его на 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;
}

10
задан Community 23 May 2017 в 12:10
поделиться