C# Windows窗体应用程序可以';不能正常关闭
关闭windows窗体应用程序时出现问题。我需要知道,如果我按下表单上的X按钮,然后单击关闭计算机,它是否总是被称为C# Windows窗体应用程序可以';不能正常关闭,c#,exit,C#,Exit,关闭windows窗体应用程序时出现问题。我需要知道,如果我按下表单上的X按钮,然后单击关闭计算机,它是否总是被称为private void Form1\u FormClosing(object sender,FormClosingEventArgs e) 任何人都不能正常关闭此时间窗体。我总是有屏幕按现在结束 我必须在窗体关闭时连接到数据库,并将一些记录复制到另一个数据库。这可能就是问题所在吗?表单快到了,sql命令无法完成 我尝试了environment.Exit(0),Applicatio
private void Form1\u FormClosing(object sender,FormClosingEventArgs e)
任何人都不能正常关闭此时间窗体。我总是有屏幕按现在结束
我必须在窗体关闭时连接到数据库,并将一些记录复制到另一个数据库。这可能就是问题所在吗?表单快到了,sql命令无法完成
我尝试了environment.Exit(0)
,Application.Exit()
。似乎没有什么工作正常
如何让它执行所有sql操作,然后退出
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//close database connection
if (Con.State == ConnectionState.Open)
Con.Close();
info.Dispose();
//last check for local database
try
{
// database queries and so on....
}
catch (Exception ex)
{
writeToLogFile(ex.Message);
}
// exit
Environment.Exit(0);
}
更新(基于您上次的评论):
我相信这会奏效
任何人都不能正常关闭此时间窗体。我总是有屏幕按下结束现在
您是说如果计算机重新启动或关闭,您希望应用程序自动关闭吗
如果是这样,只需将事件连接到Microsoft.Win32.SystemEvents.SessionEnding事件
您是否在没有Environment.Exit()的情况下尝试了上述代码?@alexm:很好。由于
环境,可能是无限递归。退出尝试再次关闭表单。尝试不实现FormClosing
事件,然后重新添加代码片段以隔离问题。项目+属性,生成选项卡,将平台目标更改为“AnyCPU”。您现在将收到一个关于64位操作系统上未处理异常的正确通知。@alexm是的,我尝试过不使用itso,在第二个选项中,我将代码放在这个while循环中?在线程下吼叫
?给我一分钟时间更新我的答案。我很抱歉把你弄糊涂了。好吧,这有点奏效了。我正在退出一个应用程序,但我的程序仍在任务管理器中运行,只要应用程序中有挂起的东西,即数据库更新,它就会运行。任务完成后,您的应用程序应从任务管理器中删除。当您关闭电脑时,我的应用程序将关闭,然后它将自动剪切?
private const int WM_QUERYENDSESSION = 0x11;
private const int WM_CANCELMODE = 0x1f;
private bool shutdownRequested = false;
...
protected override void WndProc(ref Message ex)
{
if (ex.Msg == WM_QUERYENDSESSION)
{
Message MyMsg = new Message();
MyMsg.Msg = WM_CANCELMODE;
base.WndProc(ref MyMsg);
this.shutdownRequested = true;
}
else
{
base.WndProc(ex);
}
}
...
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
this.Visible = false; // optional
this.ShowInTaskbar = false; // optional
Task db = Task.Factory.StartNew(() => DBUpdate();
Task.WaitAll(db); // you can have more tasks like the one above
if (this.shutdownRequested)
Process.Start("shutdown.exe","-s");
}
private void DBUpdate()
{
// write your db code here
}
Microsoft.Win32.SystemEvents.SessionEnding += new Microsoft.Win32.SessionEndingEventHandler(SystemEvents_SessionEnding);
void SystemEvents_SessionEnding(object sender, Microsoft.Win32.SessionEndingEventArgs e)
{
// Run your application shut down code here...
}