使用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
,则只会引发一次事件。
在应用程序即将关闭时发生。
审核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()