1

我想知道使用程序级静态表单变量来保存对我的 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 并显示等待光标。我可以依赖 Application_ThreadException 和 CurrentDomain_UnhandledException 处理程序,我可以使用 MainUI.SetBusyState 方法重新启用 UI,而不是将每个调用包装在 try catch 块中以正确重置 MainUI 的状态。

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

谢谢!

4

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 回答