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

C# 使用静态表单变量启动Winform应用程序,c#,winforms,static,C#,Winforms,Static,我想知道使用程序级静态表单变量来保存对MainUI表单的引用是否是一种安全的技术,还是我引入了一些可能导致线程或其他问题的东西?具体来说,我关心的是从应用程序中的多个位置对静态变量调用实例方法。只要对这些实例方法的所有调用都发生在应用程序线程中,我就安全了吗 static class Program { static internal MainUI MainUI; [STAThread] static void Main() { ...

我想知道使用程序级静态表单变量来保存对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);
        ...
    }
上面的代码完成了两件事

首先,应用程序本身有数百个不同的调用来通过internet检索数据,通常需要几秒钟才能完成。在此期间,需要禁用MainUI并显示等待光标。我可以依赖应用程序\u ThreadException和CurrentDomain\u UnhandledException处理程序,使用MainUI.SetBusyState方法重新启用UI,而不是在try-catch块中包装每个调用,以便在出现异常时正确重置MainUI的状态

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


谢谢

你在那里所做的是相当合法的,因为应用程序本身只有一个主窗体,只有在应用程序关闭时才会被销毁。如果你用其他形式做这件事,那将是一个更大的问题

但是,如果确实要删除静态变量,可以执行以下操作:

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

你在那里所做的是相当合法的,因为应用程序本身只有一个主窗体,只有在应用程序关闭时才会被销毁。如果你用其他形式做这件事,那将是一个更大的问题

但是,如果确实要删除静态变量,可以执行以下操作:

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

不,你不能那样做。Application.ThreadException是特殊的,它只能有一个事件处理程序。你用完了唯一的一个。试试看。@HansPassant所以如果这是唯一使用它的地方,有什么问题吗??OP已经用同样的方法了嗯,你没有试过。它不是唯一被使用的地方。@HansPassant你是说我的代码也不可能,还是仅仅是Sten的建议?@HansPassant你要告诉我们什么在这里不起作用吗?重点是如何设置主窗体的忙状态,而不是日志记录。为了完整起见,我们可以把整个应用程序都写在这里吗?不,你不能这么做。Application.ThreadException是特殊的,它只能有一个事件处理程序。你用完了唯一的一个。试试看。@HansPassant所以如果这是唯一使用它的地方,有什么问题吗??OP已经用同样的方法了嗯,你没有试过。它不是唯一被使用的地方。@HansPassant你是说我的代码也不可能,还是仅仅是Sten的建议?@HansPassant你要告诉我们什么在这里不起作用吗?重点是如何设置主窗体的忙状态,而不是日志记录。为了完整起见,我们是否也将整个应用程序写在这里?