.NET

WinForm开发的小技巧(3)——强制退出

2018-09-12  本文已影响56人  冰麟轻武

一、

最近在开发窗体应用程序(WinForm)时又双叒叕遇到了用户点击退出但程序无法结束的问题。
一直有一个进程默默的卡在哪里。。。

二、

出现这种情况一般是有一个或多个后台线程还在执行,并且没有收到终止请求,或没有正确处理终止请求。

一开始针对这种情况,设置了一个新的线程延迟做一个强制退出操作:

// 延迟5秒,如果程序没有退出,则强制结束程序
new Thread(() =>
{
    Thread.Sleep(5000);
    Environment.Exit(0);
    // 或 Process.GetCurrentProcess().Kill();
}).Start();

理想是美好的,但是这个操作本身就是一个线程啊。啊。啊。啊。。。

三、

最后选择使用一个无窗口的批处理来等待一段时间,然后强制kill线程。
使用ping的方式延时并不是很精确,但是胜在简单,且够用了。

static void ForceExit(int delay)
{
    Process.Start(new ProcessStartInfo()
    {
        FileName = "cmd",
        Arguments = $"/C \"ping 127.0.0.1 /n {delay} > nul & taskkill /F /pid {Process.GetCurrentProcess().Id}\"",
        UseShellExecute = false,
        CreateNoWindow = true,
        WindowStyle = ProcessWindowStyle.Hidden,
    });
}

如果程序可以正常退出,这个执行了也不会有任何副作用;
当然,除非你运气好到系统立马又创建一个pid一样的进程。

上一篇 下一篇

猜你喜欢

热点阅读