C#Process.Start()无法处置线程资源

时间:2011-12-19 10:27:21

标签: c# .net process

该程序的代码如下:

using System.Diagnostics;

class Test
{
    static void Main()
    {
        using (Process p = Process.Start("notepad.exe"))
        {
        }
    }
}

问题是当该程序关闭且记事本仍在运行时,记事本将锁定它。而且我不想关闭记事本 我试图用Unlocker来检测问题 结果屏幕截图如下:

Result Image Link

所以我想要的是启动一个exe文件并立即处理所有线程资源。或者我无法卸载我的程序,直到它打开的所有程序都关闭。这可能会导致令人不快的用户体验。要求系统重启也很不愉快。解锁者可以做得很好。如果我使用Unlocker解锁父文件夹,它将不会关闭记事本,然后我可以正常删除该程序文件。

3 个答案:

答案 0 :(得分:1)

问题是你从未关闭正在运行的进程,因此它会继续运行,这会导致Unlocker指示它已被锁定。

我知道你想起你做了,因为你打电话给p.Close(),但诀窍是Process.Close() method导致进程关。它不会向记事本窗口发送WM_CLOSEWM_QUIT消息。它所做的就是释放与该过程相关的资源。

相反,您需要使用Process.CloseMainWindow() method。这将向窗口发送WM_CLOSE消息,使其正常关闭。

所以更新你的代码看起来像这样(正如其他人提到的那样,如果你已经在Dispose语句中包装了对象创建,则不需要显式调用using

using System.Diagnostics;

class Test
{
    static void Main()
    {
        using (Process p = Process.Start("notepad.exe"))
        {
            p.CloseMainWindow();
            p.Close();
        }
    }
}

请注意,您可以使用Process.Kill() method,但这就像将电源线从墙上撕下来关闭计算机一样。它不是要求应用程序很好地关闭,而是强制它终止,就像点击任务管理器中的“结束任务”一样。因此,只有在进程被锁定或无法响应礼让请求才能使用时才应该使用它。


此外,正如Rolice在评论中提到的,上述代码不会非常有用。您只是启动记事本,然后立即关闭它。

相反,您可能希望启动该过程,允许用户与其进行交互,然后在完成后进行清理。

在这种情况下,您需要使用Process.WaitForExit()方法。此方法将阻止调用线程,无限期地等待进程退出。当用户最终关闭记事本时,控件将返回到应用程序的线程,您可以调用p.Close()

例如:

using System.Diagnostics;

class Test
{
    static void Main()
    {
        using (Process p = Process.Start("notepad.exe"))
        {
            p.WaitForExit();
            p.Close();
        }
    }
}

答案 1 :(得分:0)

这里有两种可能的解决方案

  1. 在您的应用程序中,在退出应用程序之前等待进程退出。有several ways来执行此操作。
  2. 在您的应用程序退出时终止该过程。 nicelyby force后者不是很好,如果用户正在编辑某些内容,可能会导致数据丢失。
  3. 如果上面的情况#1,您可以向用户弹出一个对话框或其他内容,告知您正在等待记事本退出(可能还有一个按钮来终止它)

答案 2 :(得分:-4)

尝试启动该过程而不参考它:

Process.Start("notepad.exe");