Почему приложение .NET препятствует завершению работы Windows? - PullRequest
3 голосов
/ 24 августа 2010

Одно из моих приложений предотвращает закрытие окон, если оно работает.

Единственное место, где я подозреваю причину, может быть обработчик события FormClosing, который, однако, вполне стандартен:

РЕДАКТИРОВАТЬ: удаление этого обработчика не меняет ситуацию вообще, поэтому причина в другом.

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.UserClosing)
    {
        StopAllThreads(); 
        //let close
        return;
    }
    //ask user whether he wants to save his work
}

Мне не удалось воспроизвести это в простейшем приложении, содержащем только этот обработчик FormClosing - простое приложение корректно закрывается, когда окна начинают закрываться.

Что еще может помешать закрытию окон? Где я должен искать в коде для устранения этой проблемы?

У меня нет основной реализации WndProc в моей основной форме. Это приложение .NET 2.0.

Когда я запускаю приложение в отладчике и инициирую завершение работы, я получаю только «Эта программа не позволяет завершить работу Windows» (Windows 7) на короткое время. Затем Windows закрывает Visual Studio, которая отключает отладчик, который закрывает отлаживаемое приложение.


РЕДАКТИРОВАТЬ: метод StopAllThreads

public static void StopAllThreads()
{
    lock (syncLock)
    {
        foreach (IStop stoppable in stoppables)
        {
            try
            {
                stoppable.Stop(); //stops a running thread by setting a volatile boolean flag
            }
            catch (Exception ex)
            {
                Debug.Fail("Error stopping a stoppable instance: " + ex.ToString());
            }
        }
        stoppables.Clear();
        disposed = true;
    }
}

Обратите внимание: приложение может быть нормально закрыто, когда пользователь закрывает его вручную.

Ответы [ 2 ]

3 голосов
/ 07 декабря 2010

Проблема решена: одна из дочерних форм переопределяла OnClosing со следующим кодом:

    protected override void OnClosing(CancelEventArgs e)
    {
        e.Cancel = true;
        this.Hide();
    }
1 голос
/ 24 августа 2010

Проходили ли вы этот код вообще, чтобы посмотреть, справится ли он с выполнением всего этого или он застрянет где-нибудь?Возможно, по какой-то причине блокировка не может завладеть syncLock и ждет.

...