2013-03-29 50 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

嗯,你没有尝试过。它不是唯一使用它的地方。 –