2013-03-29 75 views
1

我使用的是程序級的靜態表格變量來保存到我的MainUI形式的參考,是一種安全技術,想知道如果,還是我介紹的東西,可能會導致線程或其他問題?具體來說,我擔心應用程序中的多個位置的靜態變量上調用實例方法。只要對這些實例方法的所有調用都發生在應用程序線程中,我是否安全?啓動winform應用程序使用靜態表單變量

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並顯示等待光標。相反,包裹在一個try catch塊每次調用只是正常復位異常的情況下,MainUI的狀態,我可以依靠Application_ThreadException和CurrentDomain_UnhandledException處理程序,我可以重新啓用使用MainUI.SetBusyState方法的UI。

其次,我可以創建在MainUI有用的實例方法,使他們以清潔的方式使用Program.MainUI應用程序的其餘部分可用。例如,我可以在我的用戶控件,而不是((MainUI)this.ParentForm).SetBusyState使用Program.MainUI.SetBusyState。但使用這樣的實例方法是我最關心的問題。

謝謝!

回答

0

這是非常合法的,你做了什麼,因爲有應用程序本身將只有當應用程序被關閉,將只被破壞主要形式之一。如果你用其他形式來做這件事,那將會是一個更大的問題。

如果你這樣做,不過,想擺脫靜態變量,你可以做到這一點的:

[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); 
    } 
+0

不,你不能這樣做。 Application.ThreadException是特殊的,它可以只有*一個*事件處理程序。你用盡了唯一的。嘗試一下。 –

+0

@HansPassant所以如果這是唯一使用它的問題是什麼? OP已經以同樣的方式使用它 –

+0

嗯,你沒有嘗試過。它不是唯一使用它的地方。 –