我使用的是程序级的静态表格变量来保存到我的MainUI形式的参考,是一种安全技术,想知道如果,还是我介绍的东西,可能会导致线程或其他问题?具体来说,我担心应用程序中的多个位置的静态变量上调用实例方法。只要对这些实例方法的所有调用都发生在应用程序线程中,我是否安全?启动winform应用程序使用静态表单变量
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并显示等待光标。相反,包裹在一个try catch块每次调用只是正常复位异常的情况下,MainUI的状态,我可以依靠Application_ThreadException和CurrentDomain_UnhandledException处理程序,我可以重新启用使用MainUI.SetBusyState方法的UI。
其次,我可以创建在MainUI有用的实例方法,使他们以清洁的方式使用Program.MainUI应用程序的其余部分可用。例如,我可以在我的用户控件,而不是((MainUI)this.ParentForm).SetBusyState使用Program.MainUI.SetBusyState。但使用这样的实例方法是我最关心的问题。
谢谢!
不,你不能这样做。 Application.ThreadException是特殊的,它可以只有*一个*事件处理程序。你用尽了唯一的。尝试一下。 –
@HansPassant所以如果这是唯一使用它的问题是什么? OP已经以同样的方式使用它 –
嗯,你没有尝试过。它不是唯一使用它的地方。 –