我想知道使用程序级静态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 。但是使用像这样的实例方法是我最关心的问题。
谢谢!
答案 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);
}