2009-08-06 12 views
11

Einfache Frage: Ich möchte eine URL mit dem Standardbrowser öffnen, also mache ich einfach Process.Start(url). Ich habe jedoch festgestellt, dass dies ein IDisposable-Objekt zurückgibt.Muss ich Process.Start (url) entsorgen?

So, jetzt frage ich mich, ob ich es entsorgen muss? Oder, wenn meine Anwendung in irgendeiner Weise für diesen Prozess verantwortlich ist? Die beabsichtigte Funktionalität ist einfach "Feuer und vergessen", ich möchte meine Anwendung nicht als Elternteil des neuen Prozesses haben und muss nicht mit ihr interagieren.

Ich habe einige ähnliche, aber nicht verwandte Fragen zu SO gesehen, die zu sagen scheinen, dass das einfache Aufrufen von Process.Start auf einer URL in Ordnung ist, aber ich möchte nicht auf einige schwer zu debuggende Speicherlecks/Ressourcenerschöpfungsprobleme stoßen Mein Programm speichert Verweise auf lange tote Browserprozesse.

Antwort

9

Könnten Sie es nicht einfach in eine using-Klausel einfügen, um sicherzustellen, dass der GC alles tut, was er damit zu tun hat, wenn Sie es entsorgen müssen? Dies würde immer noch eine Art "Feuer und Vergessen" erlauben, aber den Speicher/Ressourcen nicht in einem schlechten Zustand belassen.

wahrscheinlich übertrieben, aber es ist ein wirklich guter Artikel über Codeproject über die IDisposable-Schnittstelle: http://www.codeproject.com/KB/dotnet/idisposable.aspx

+0

Das Problem ist, dass ich das Objekt Leben in dieser Situation nicht vollständig verstehe. Wenn ich (Process.Start (url)) verwende; Dann wird es an diesem Punkt warten? Oder wird es den Prozess zu früh entsorgen? Im Moment macht das keinen Unterschied im Verhalten, daher bin ich der Meinung, dass es keine Ressourcen gibt, die offen gehalten werden, aber ich weiß es nicht genau und ich weiß nicht, wie ich das messen soll. –

+0

Da die "using" -Klausel den Compiler implizit anweist, einen try/finally zu erstellen und eine dispose zu implementieren und die Tatsache, dass sie ein IDisposable-Objekt zurückgeben, denke ich, dass Sie das sicher tun könnten. Wenn Sie es nicht freigeben, binden Sie möglicherweise Ressourcen. Sie könnten versuchen, eine Schleife zu erstellen, die mehrere URLs öffnet, ohne sie zu beseitigen und zu sehen, ob Ihre Ressourcen außer Kontrolle geraten, und einen weiteren Test, indem Sie sie in Klauseln einbetten. Der Vorbehalt ist, dass Sie eine Reihe von Fenstern haben, um danach zu schließen. :) – Fooberichu

5

Starten des Prozesses ist eine native Aufruf, die einen nativen Prozess-Handle zurückgibt, die in der Instanz von Prozess gespeichert wird, der zurückgegeben wird . Es gibt Methoden in Process, die das Handle verwenden, damit Sie beispielsweise warten können, bis der Prozess beendet wird oder inaktiv wird.

Wenn Sie den Prozess freigeben, wird dieser Punkt freigegeben. Ich stimme Jon zu, wickle es in eine using-Klausel.

10

Nein, das tust du nicht.

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

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

Drucke

It returned null

Von Process.Start Method (String) auf MSDN (.NET Framework 4):

Wenn die Adresse der ausführbaren Datei eine URL zu starten ist, der Prozess ist nicht gestartet und null wird zurückgegeben.

(In der Regel aber die using Aussage ist der richtige Weg, mit IDisposable Objekten zu arbeiten. Mit Ausnahme WCF clients.)

+0

Selbst wenn der Browserprozess ** IS ** gestartet wird, gibt es immer noch null zurück! – AgentFire

+0

@AgentFire Sie erhalten für eine URL immer null, unabhängig davon, ob Ihr Browser geladen werden muss oder nicht. Das ist der Punkt - Sie müssen nicht in diesem speziellen Fall (URLs) verfügen. – TrueWill

2

@ Fooberichu Antwort genau das Richtige ist, aber ich denke, es ist auch wert darauf hin, dass normalerweise müssen nur ein paar Dinge explizit entsorgt werden.

Objekte werden immer effektiv bei etwas Punkt angeordnet:

  • Jedes Mal, wenn der GC eine Sammlung der Fall ist, wird es (eventuell) verfügen über Objekte, die nicht mehr referenziert werden. Wenn Sie also nicht manuell disponieren, wird das Objekt möglicherweise noch innerhalb weniger Sekunden nach Verlassen des Bereichs entsorgt.
  • Wenn Ihre Anwendung beendet wird, werden alle Ressourcen freigegeben. (Obwohl die Objekte nicht von C#/.net entsorgt werden können, beansprucht das Betriebssystem so ziemlich alles zurück, was Ihr Prozess ergriff.Wenn die Lebensdauer der Ressource über Ihre Anwendung erstreckt, dann ist das Betriebssystem in der Regel verantwortlich für die Reinigung it up)

Der Punkt, der manuell Entsorgung (oder unter Verwendung eines ‚mit‘) ist daher nicht, um sicherzustellen, dass die Ressourcen wird freigegeben werden, aber zu veröffentlichen Sie so früh wie möglich.

Heutzutage ist es unwahrscheinlich, dass Ihnen die meisten Ressourcentypen ausgehen (z. B. Speicher, Dateihandles oder Systempinsel). Wenn Sie jedoch an Ressourcen festhalten, die Sie nicht benötigen, ist Ihr Programm wahrscheinlich weniger effizient, Sie verwenden möglicherweise mehr Speicher als erforderlich oder verursachen möglicherweise Verzögerungen, indem Sie andere Anwendungen vorübergehend daran hindern, nützliche Dinge zu tun Im Allgemeinen geht es bei Disposing also um gute Etikette, Ordnung und unnötige Ineffizienzen.

Es gibt einige Fälle, in denen Ressourcen muss freigegeben werden (zB wenn Sie nicht über eine Datei schließen, können Sie nicht öffnen/umbenennen/verschieben/löschen es von einer anderen Stelle im Programm oder andere Programme, wenn Sie Wenn Sie Texturen auf Ihrer Grafikkarte zuweisen, ohne sie zu veröffentlichen, haben Sie keinen VRAM mehr und die Anzeige des Computers wird fehlschlagen. Im Allgemeinen werden Sie jedoch selten auf diese Situationen stoßen und wenn Sie Best Practices befolgen Sie werden normalerweise nicht mehr wissen müssen, wann diese Situationen auftreten, weil Sie sie bereits korrekt behandeln.

+2

In vielen Fällen haben IDisposable-Klassen keine Finalizer. Wenn sie explizit deklariert werden, werden alle nicht verwalteten Ressourcen, die ihnen zugeordnet sind, verloren. Die Framework-Klassen leisten in den meisten Fällen gute Dienste, um uns zu schützen, aber die beste Vorgehensweise besteht darin, immer über IDisposable-Objekte zu verfügen. Dies und WCF-Clients sind zwei seltsame Randfälle. – TrueWill