我想知道使用程序级静态表单变量来保存对我的 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。但是使用像这样的实例方法是我主要关心的问题。
谢谢!