我使用的是程序級的靜態表格變量來保存到我的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。但使用這樣的實例方法是我最關心的問題。
謝謝!
不,你不能這樣做。 Application.ThreadException是特殊的,它可以只有*一個*事件處理程序。你用盡了唯一的。嘗試一下。 –
@HansPassant所以如果這是唯一使用它的問題是什麼? OP已經以同樣的方式使用它 –
嗯,你沒有嘗試過。它不是唯一使用它的地方。 –