Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否必须处理进程启动(url)?_C#_.net - Fatal编程技术网

C# 是否必须处理进程启动(url)?

C# 是否必须处理进程启动(url)?,c#,.net,C#,.net,简单问题:我想使用默认浏览器打开一个URL,所以我只需执行Process.Start(URL)。但是,我注意到它返回一个IDisposable对象 所以现在我想知道我是否必须处理它?或者,就这一点而言,如果我的申请对这一过程负有任何责任?预期的功能只是“启动并忘记”,我不想让我的应用程序作为新流程的父级,它也不需要与之交互 我在上看到过一些类似但不相关的问题,似乎是简单地调用流程。从URL开始就可以了,但是我不想遇到一些难以调试的内存泄漏/资源耗尽问题,这些问题导致我的me程序保留对长时间死机的

简单问题:我想使用默认浏览器打开一个URL,所以我只需执行
Process.Start(URL)
。但是,我注意到它返回一个IDisposable对象

所以现在我想知道我是否必须处理它?或者,就这一点而言,如果我的申请对这一过程负有任何责任?预期的功能只是“启动并忘记”,我不想让我的应用程序作为新流程的父级,它也不需要与之交互


我在上看到过一些类似但不相关的问题,似乎是简单地调用流程。从URL开始就可以了,但是我不想遇到一些难以调试的内存泄漏/资源耗尽问题,这些问题导致我的me程序保留对长时间死机的浏览器进程的引用。

您不能使用子句将其包装在
中,以确保GC在需要处理它时对其执行任何操作吗?这仍然允许某种“触发并忘记”,但不会使内存/资源处于不良状态


可能有些过分,但是关于IDisposable接口的CodeProject上有一篇非常好的文章:

启动进程是一个本机调用,它返回一个本机进程句柄,该句柄存储在返回的进程实例中。进程中有一些方法使用句柄,所以您可以执行诸如等待进程退出或变为空闲等操作

处理该进程将释放该句柄。我同意乔恩的观点,把它用using子句括起来。

不,你不同意

void Main()
{
    Process result = Process.Start("http://www.google.com");

    if (result == null)
    {
        Console.WriteLine("It returned null");
    }
}
印刷品

It returned null 它返回空值 从MSDN(.NET Framework 4)上开始:

如果要启动的可执行文件的地址是URL,则进程 未启动,返回null


(一般来说,
使用
语句是处理IDisposable对象的正确方法。除了。)

@Fooberichu的答案是正确的,但我认为也值得指出的是,通常只有少数事情“需要”被显式处理

始终在某个点有效地处理对象:

  • 每当GC进行收集时,它(最终)都会处理不再被引用的对象。因此,如果不手动处置,对象可能仍会在超出范围的几秒钟内被处置
  • 当您的应用程序退出时,它所拥有的所有资源都将被释放。(尽管C#/.net可能不会处理这些对象,但操作系统将收回进程捕获的几乎所有内容。如果资源的生命周期超出了应用程序,则操作系统通常负责清理)
因此,手动处理(或采用“使用”)的目的不是确保资源被释放,而是尽早释放它们

现在,大多数类型的资源(例如内存、文件句柄或系统刷)都不太可能用完。但是,如果您在不需要的情况下保留资源,您的程序可能会效率较低,您可能会使用过多的内存,或者可能会暂时阻止其他应用程序执行有用的操作,从而导致延迟等。一般来说,处置是一种良好的礼仪,整洁,减少不必要的低效率


在某些情况下,必须释放资源(例如,如果不关闭文件,则无法从程序或其他程序的其他位置打开/重命名/移动/删除该文件;如果您一直在图形卡上分配纹理而不释放纹理,则VRAM将耗尽,计算机显示将失败),但一般来说,您很少会遇到这些情况,如果您遵循最佳实践(当不再需要对象时显式地处理它们),您通常不需要知道这些情况何时发生,因为您已经正确地处理了它们

问题是我没有完全理解这种情况下的对象生命。如果我使用(Process.Start(url));那么它会在那一点上等待吗?或者,它是否会将该过程提前处理?目前,这在行为上没有什么区别,所以我猜没有任何资源是开放的,但我不确定,也不知道如何衡量。因为“使用”子句隐式指示编译器构建try/finally并实现dispose,以及它们返回IDisposable对象这一事实,我认为这样做是安全的。如果不取消分配,可能会占用资源。您可以尝试构建一个循环,打开多个URL而不处理它们,然后查看您的资源是否失控,并通过将它们包装在using子句中进行另一项测试。需要注意的是,在此之后,您将有一大堆窗户要关闭。:)在许多情况下,IDisposable类没有终结器。如果它们是GC的,而没有被显式地释放,那么与它们关联的任何非托管资源都将被泄漏。在大多数情况下,框架类在保护我们方面做得很好,但最佳实践是始终处理IDisposable对象。这和WCF客户端恰好是两种奇怪的边缘情况。
每当GC进行收集时,它(最终)都会处理不再引用的对象。因此,如果不手动处置,对象可能仍会在超出范围的几秒钟内被处置。
这无法保证。终结器不保证调用
Dispose
。它最终将进行垃圾收集是(好吧,从技术上说是“可能”)——但不一定是
Dispose
。即使浏览器进程启动,它仍然返回null@AgentFire无论是否必须加载浏览器,URL都将始终为空。这就是重点——在这种特定情况下,您不必处理URL。