该程序的代码如下:
using System.Diagnostics;
class Test
{
static void Main()
{
using (Process p = Process.Start("notepad.exe"))
{
}
}
}
问题是当该程序关闭且记事本仍在运行时,记事本将锁定它。而且我不想关闭记事本 我试图用Unlocker来检测问题 结果屏幕截图如下:
所以我想要的是启动一个exe文件并立即处理所有线程资源。或者我无法卸载我的程序,直到它打开的所有程序都关闭。这可能会导致令人不快的用户体验。要求系统重启也很不愉快。解锁者可以做得很好。如果我使用Unlocker解锁父文件夹,它将不会关闭记事本,然后我可以正常删除该程序文件。
答案 0 :(得分:1)
问题是你从未关闭正在运行的进程,因此它会继续运行,这会导致Unlocker指示它已被锁定。
我知道你想起你做了,因为你打电话给p.Close()
,但诀窍是Process.Close()
method做不导致进程关。它不会向记事本窗口发送WM_CLOSE
或WM_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)
这里有两种可能的解决方案
答案 2 :(得分:-4)
尝试启动该过程而不参考它:
Process.Start("notepad.exe");