使用静态表单变量启动Winform应用程序

时间:2013-03-29 15:48:01

标签: c# winforms static

我想知道使用程序级静态Form变量来保存对我的MainUI表单的引用是一种安全的技术,还是我介绍的东西可能导致线程或其他问题?具体来说,我担心从应用程序中的多个位置调用静态变量上的实例方法。只要所有对这些实例方法的调用都发生在应用程序线程中,我安全吗?

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的状态,我可以依赖于Application_ThreadException和CurrentDomain_UnhandledException处理程序,而不是在try catch块中包装每个调用,我可以使用MainUI.SetBusyState方法重新启用UI。

其次,我可以在MainUI上创建有用的实例方法,并使用Program.MainUI以干净的方式将它们提供给应用程序的其余部分。例如,我可以在用户控件中使用 Program.MainUI.SetBusyState ,而不是((MainUI)this.ParentForm).SetBusyState 。但是使用像这样的实例方法是我最关心的问题。

谢谢!

1 个答案:

答案 0 :(得分: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);
    }