Закрытие основной формы не завершает процесс в Windows 7 - PullRequest
0 голосов
/ 23 февраля 2011

У меня есть форма MDI в качестве начального объекта приложения.

Я не думаю, что это связано, но в событии закрытия формы я проверяю некоторые условия, и если это правда, я спрашиваю подтверждение перед закрытием:

Private Sub FormBackground_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    If (e.CloseReason = CloseReason.UserClosing) Then
        If (conditionIsMet) Then
            Dim res As DialogResult
            res = MessageBox.Show("Are you sure?", "Warning", MessageBoxButtons.YesNo)
            If (res <> Windows.Forms.DialogResult.Yes) Then
                e.Cancel = True
            End If
        End If
    End If
End Sub

Так долговсе отлично работает на моей машине, которая работает под управлением Windows XP.

Однако при развертывании приложения на компьютере с Windows 7 окно сообщения работает правильно, показывая себя, когда это необходимо, но после закрытия формы приложение продолжает работать в фоновом режиме.Это происходит независимо от того, закрывается ли форма напрямую или сначала запрашивает пользователя.

Я (надеюсь) исправил ее, поместив инструкцию End в событие FormBackground.FormClosed, но это не очень хорошо.В качестве обходного пути пока все нормально, но я бы хотел найти причину проблемы.

Есть мысли?

Ответы [ 4 ]

2 голосов
/ 23 февраля 2011

это много обсуждалось в последнее время, возможно ли, что вы запустили некоторые потоки в своем приложении и не установили их в качестве фоновых потоков?

1 голос
/ 10 июня 2011

Кажется, что проблема была вызвана сторонней библиотекой COM.Единственное работающее решение, которое я смог найти:

Private Sub MDIParentForm_Closing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    If (e.CloseReason = CloseReason.UserClosing) Then
        If (Not CanClose()) Then
            e.Cancel = True
        End If
    End If
    If (Not e.Cancel) Then
        Process.GetCurrentProcess().Kill()
    End If
End Sub

Мне это не нравится, но оно работает, когда End нет.

1 голос
/ 24 февраля 2011

Вы можете попробовать это.Вызовите его из формы mdi, возможно, обработчик ошибок что-то подхватит.

Private Sub CloseAllDataforms()
    Dim frm As Form
    ' Unload all the child forms, if any.  
    Try
        For Each frm In Me.MdiChildren
            If Not frm.Name = "MDI_Main" Then
                If frm.IsMdiChild = True Then
                    frm.Close()
                    frm.Dispose()
                End If
            End If
        Next
    Catch eX As Exception
        Debug.Print(eX.Message.ToString())
    End Try

End Sub
1 голос
/ 23 февраля 2011

Скорее всего, закрыты не все формы заявки.Попробуйте этот код

For Each frm as Form in My.Application.OpenForms
    frm.Close
Next

Он закроет все формы в вашем приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...