Windows窗体应用程序无法正常关闭

时间:2012-06-16 14:51:14

标签: c# exit

关闭Windows窗体应用程序时遇到问题。我需要知道,如果我在表单上按 X 按钮并且我只是点击关闭计算机,它总是被称为private void Form1_FormClosing(object sender, FormClosingEventArgs e)吗?

这些时间形式的任何人都没有正常关闭。我总是有屏幕按现在结束

我在表单关闭时连接到数据库,并将一些记录复制到另一个数据库。这可能是问题吗?表单是快速关闭,sql命令无法完成?

我已尝试Enviroment.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);
        }

2 个答案:

答案 0 :(得分:1)

更新(根据您的上次评论):

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
}

我相信这会奏效。

答案 1 :(得分:0)

  

这些时间形式的任何人都没有正常关闭。我总是有屏幕按现在结束

您是说要让应用程序在重新启动或关闭时自动关闭?

如果是这样,只需将事件挂钩到 Microsoft.Win32.SystemEvents.SessionEnding 事件。

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...
    }