2

私は最近学校を卒業し、プログラマーとして最初の仕事をしています。アプリケーション タイムアウト タイマーがアプリケーションを閉じるときに発生するバグがユーザーから報告されました。私はそれを絞り込んだと確信していますが、元のプログラマーがなぜこれを行ったのか、それが優れたコーディング慣行である場合、興味があります。メイン フォームが閉じた後に発生するため、クロージング後のシステム エラーが発生しているため、例外ログ入力は取得されません。

timeoutTimer_tick ハンドラーの終了機能は、次のことを行います。

    For iCount As Int16 = Application.OpenForms.Count - 1 To 0 Step -1
        Try
            Application.OpenForms(iCount).Close()
        Catch
        End Try
    Next
    Try
        Application.Exit()
    Catch ex As Exception
    End Try

プログラムは、メイン フォームが閉じたときにアプリケーション プロパティを閉じるように設定されています (開いているすべてのフォームが閉じられるわけではありません)。これは、各フォームをループして個別に閉じてから Application.Exit() を呼び出す理由を不思議に思います。

私たちのエラーは、開いているすべてのフォームが閉じられた後の Application.Exit 呼び出しが原因であると確信しています。ループ中にメイン フォームが閉じられたため、メイン フォームが表示されず、エラーがスローされます。両方ではなく、どちらか一方を使用する必要があるように感じます。

入力やアドバイスはありますか?どちらが優れているか、またはどちらかが優れています (または、このコードがエラーなしで機能するはずであり、私は単に間違っています)。

ありがとう

4

1 に答える 1

3

WinForms には、シャットダウン モードの設定があります ([プロジェクト プロパティ] > [アプリケーション] タブ)。

これにより、指定When startup form closesまたはWhen last form closes

したがって、論理的には必要ありません。必要なApplication.Exit場合は、破棄する必要がある他のオブジェクトがメモリ内にぶら下がっています(スレッド/バックグラウンドワーカーなどで開始されたもの)

したがって、スタートアップフォームの設定がある場合:

[StartupFormName].Close

または、最後のフォーム設定がある場合:

Do While My.Application.OpenForms.Count > 0
    My.Application.OpenForms(0).Close()
Loop
于 2013-05-29T13:30:27.073 に答える