1

プログラム レベルの静的フォーム変数を使用して MainUI フォームへの参照を保持することが安全な手法なのか、それともスレッド化やその他の問題を引き起こす可能性のあるものを導入しているのか疑問に思っています。具体的には、アプリケーション内の複数の場所から static 変数のインスタンス メソッドを呼び出すことについて懸念しています。これらのインスタンス メソッドへのすべての呼び出しがアプリケーション スレッド内で発生する限り、安全ですか?

static class Program
{
    static internal MainUI MainUI;

    [STAThread]
    static void Main()
    {
        ...            
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        MainUI = new MainUI();
        Application.Run(MainUI);
        ...    
    }

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
    {
        ...
        MainUI.SetBusyState(false);
        ...
    }

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        ...
        MainUI.SetBusyState(false);
        ...
    }

上記のコードは、いくつかのことを実現します。

まず、アプリケーション自体には、インターネット経由でデータを取得するための数百の異なる呼び出しがあり、完了するまでに数秒かかることがよくあります。この間、MainUI を無効にし、待機カーソルを表示する必要があります。例外が発生した場合に MainUI の状態を適切にリセットするためだけにすべての呼び出しを try catch ブロックにラップする代わりに、Application_ThreadException および CurrentDomain_UnhandledException ハンドラーに依存して、MainUI.SetBusyState メソッドを使用して UI を再度有効にすることができます。

次に、MainUI で便利なインスタンス メソッドを作成し、Program.MainUI を使用してアプリケーションの残りの部分でクリーンな方法でそれらを利用できるようにします。たとえば、ユーザー コントロールで((MainUI)this.ParentForm).SetBusyStateの代わりにProgram.MainUI.SetBusyStateを使用できます。しかし、このようなインスタンス メソッドを使用することは、私の主な関心事です。

ありがとう!

4

1 に答える 1

1

アプリ自体には、アプリが閉じられたときにのみ破棄されるメインフォームが 1 つしかないため、そこで行ったことはかなり正当です。他のフォームでこれを行っていた場合は、さらに問題になります。

ただし、静的変数を取り除きたい場合は、次のようにすることができます。

   [STAThread]
   static void Main()
   { 
        MainUI form = new MainUI();
        AppDomain.CurrentDomain.UnhandledException += (s,e)=> {
            form.SetBusyState(false);
        };
        Application.ThreadException += (s,e)=> {
            form.SetBusyState(false);
        };  
        Application.Run(form);
    }
于 2013-03-29T15:54:05.653 に答える