Application.ApplicationExit意外地第二次引发

时间:2016-05-01 23:09:04

标签: c# winforms events exit

使用glm(I(baut==1) ~ log(laggdppc) + pnbdem + cwar + ipyears + egr + propdem + I(bautlag) + I(log(laggdppc)*bautlag) + I(pnbdem*bautlag) + I(cwar*bautlag) + I(ipyears*bautlag) + I(egr*bautlag) + I(propdem*bautlag) + I(nbtd>0*bautlag), model=T, family=binomial(link=probit),na.action=na.omit,data=repdata, control=glm.control(epsilon=0.0001, maxit=100)) Form等关闭主.Close,然后调用ControlBox会导致Application.Exit()事件被提升两次。但是,如果先通过调用ApplicationExit关闭Form,则只会引发一次事件。

Documentation说:

  

在应用程序即将关闭时发生。

审核source code会显示一个私有Application.Exit()方法,该方法仅从RaiseExit调用,并使用注释进行修饰:

  

在关闭之前由最后一个线程上下文调用。

这显然不完全正确。将为没有运行MessageLoop的任何ThreadContext.Dispose(bool PostQuit)调用它。

额外的鬼魂在哪里? ThreadContext来自应用程序通过ThreadContext

关闭时

澄清"幽灵Form":
正如所料,在ThreadContext执行时,会创建ThreadContext并为该线程启动消息循环。关闭表单时,将关闭该消息循环并放置Application.Run(new MainForm()),以适当地引发ThreadContext事件。但是,在关闭的某个位置,创建了一个没有消息循环的新ApplicationExit,如果随后调用ThreadContext,则会导致ApplicationExit再次触发。

的Program.cs:

Application.Exit()

MainForm只有一个调用using System; using System.Threading; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { private static int _ApplicationExitEventCount = 0; /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.ApplicationExit += Application_ApplicationExit; Application.Run(new MainForm()); //Just to make sure not suffering a race. Thread.Sleep(TimeSpan.FromSeconds(2)); for (int i = 0; i < 10; i++) //A loop to show it's not dependent on the times Application.Exit() is called. { //Application.Exit() Disposes the ThreadContext so a call to MessageLoop creates a new one. //Uncomment the following line to show that ApplicationExit will be raised for each itteration. //Console.WriteLine("Application.MessageLoop: {0}", Application.MessageLoop); Application.Exit(); } Console.WriteLine(string.Format("ApplicationExit event count: {0}", _ApplicationExitEventCount.ToString())); } private static void Application_ApplicationExit(object sender, EventArgs e) { _ApplicationExitEventCount++; } } } 的按钮。 Application.Exit周围的循环用于演示此行为并不像每次调用Application.Exit()时引发的事件一样简单。

MainForm.cs

Application.Exit()

0 个答案:

没有答案