简单问题:我想使用默认浏览器打开一个URL,所以我只做Process.Start(url)
。但是,我注意到这会返回一个IDisposable对象。
所以现在我想知道我是否必须处理它?或者,就此而言,如果我的应用程序以任何方式对此过程负责?预期的功能只是“一气呵成”,我不希望我的应用程序作为新进程的父进程,也不需要与它进行交互。
我在SO上看到了一些类似但不相关的问题,似乎只是说在URL上调用Process.Start很好,但我不想遇到一些难以调试的内存泄漏/资源耗尽问题导致我的问题我程序保持对长时间浏览器进程的引用。
答案 0 :(得分:10)
不,你没有。
void Main()
{
Process result = Process.Start("http://www.google.com");
if (result == null)
{
Console.WriteLine("It returned null");
}
}
打印
It returned null
来自MSDN上的Process.Start Method (String)(.NET Framework 4):
如果要启动的可执行文件的地址是URL,则为该进程 未启动并返回null。
(一般情况下,using
语句是使用IDisposable对象的正确方法。WCF clients除外。)
答案 1 :(得分:9)
难道你不能把它包装在一个using
子句中,以确保GC做任何需要处理它的事情如果你需要处理它吗?这仍然会允许某种“发射并忘记”但不会使内存/资源处于不良状态。
可能有点矫枉过正,但有关IDisposable界面的CodeProject上有一篇非常好的文章:http://www.codeproject.com/KB/dotnet/idisposable.aspx
答案 2 :(得分:5)
启动进程是一个本机调用,它返回一个本机进程句柄,该句柄存储在返回的Process实例中。 Process中有一些方法可以使用句柄来执行等待进程退出或空闲的操作。
处理进程释放了句柄。我同意Jon,将其包含在使用条款中。
答案 3 :(得分:3)
@Fooberichu的回答很明显,但我认为值得指出的是,通常只需要明确处理一些事情。
对象始终在某些点处有效处理:
因此,手动处理(或使用'使用')的重点不是确保将释放资源,而是尽早释放
现在,您不太可能耗尽大多数类型的资源(例如内存,文件句柄或系统画笔)。但是,如果您在不需要时保留资源,那么您的程序可能效率较低,可能会使用超过必要的内存,或者可能会暂时阻止其他应用程序执行有用的操作等导致延迟。一般来说,处理是关于良好的礼仪,整洁和削减不必要的低效率。
在某些情况下,必须必须释放资源(例如,如果您不关闭文件,则无法从程序中的其他位置打开/重命名/移动/删除它程序;如果你继续在你的显卡上分配纹理而不释放它们,你将耗尽VRAM并且计算机的显示将失败),但一般来说,你很少会遇到这些情况,并且如果你遵循最佳实践(明确处理)当它们不再需要时,你通常不需要知道这些情况何时发生,因为你已经正确处理它们了。