C# Windows窗体应用程序可以';不能正常关闭

C# Windows窗体应用程序可以';不能正常关闭,c#,exit,C#,Exit,关闭windows窗体应用程序时出现问题。我需要知道,如果我按下表单上的X按钮,然后单击关闭计算机,它是否总是被称为private void Form1\u FormClosing(object sender,FormClosingEventArgs e) 任何人都不能正常关闭此时间窗体。我总是有屏幕按现在结束 我必须在窗体关闭时连接到数据库,并将一些记录复制到另一个数据库。这可能就是问题所在吗?表单快到了,sql命令无法完成 我尝试了environment.Exit(0),Applicatio

关闭windows窗体应用程序时出现问题。我需要知道,如果我按下表单上的X按钮,然后单击关闭计算机,它是否总是被称为
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...
    }