2009-08-06 11 views
11

Pregunta simple: Quiero abrir una URL usando el navegador predeterminado, así que solo hago Process.Start(url). Sin embargo, noté que esto devuelve un objeto IDisposable.¿Debo deshacerme del Process.Start (url)?

Así que ahora me pregunto si tengo que desecharlo? O, para el caso, si mi Aplicación es de alguna manera responsable de este proceso? La funcionalidad prevista es simplemente "Dispara y olvida", no quiero tener mi aplicación como padre del nuevo proceso y no es necesario que interactúe con ella.

He visto algunas preguntas similares pero no relacionadas sobre SO que parecen decir que simplemente llamar a Process.Start en una URL está bien, pero no quiero encontrarme con algunos problemas de depuración de fallas de memoria/agotamiento de recursos. mi programa me mantiene las referencias a los procesos de navegador muertos hace mucho tiempo.

Respuesta

9

¿No podría simplemente envolverlo en una cláusula using para asegurar que el GC haga lo que tenga que hacer con él si tiene que deshacerse de él? Esto todavía permitiría una especie de "disparar y olvidar", pero no dejar la memoria/recursos en mal estado.

algo excesivo, pero hay un muy buen artículo sobre CodeProject sobre la interfaz IDisposable: http://www.codeproject.com/KB/dotnet/idisposable.aspx

+0

El problema es que no entiendo completamente la vida del objeto en esta situación. Si lo hago usando (Process.Start (url)); entonces ¿esperará en ese punto? ¿O eliminará el proceso temprano? Por el momento, eso no hace ninguna diferencia en el comportamiento, por lo que _sugiere_ que no hay recursos que se mantienen abiertos, pero no estoy seguro y no sé cómo medir eso. –

+0

Dado que la cláusula "using" instruye implícitamente al compilador para crear una try/finally e implementar un dispose y el hecho de que están devolviendo un objeto IDisposable, creo que sería seguro hacerlo. Al no desasignarlo, puede estar atando recursos. Podría tratar de crear un bucle que abra varias URL sin eliminarlas y ver si sus recursos se salen de control y otra prueba enviándolas al uso de cláusulas. La advertencia es que tendrás un montón de ventanas para cerrar después de eso. :) – Fooberichu

5

Inicio del proceso es una llamada nativa que devuelve un identificador de proceso nativo, que se almacena en la instancia de proceso que se devuelve . Existen métodos en Process que usan el handle para que pueda hacer cosas como esperar que el proceso salga, o quedarse inactivo.

La eliminación del proceso libera ese asa. Estoy de acuerdo con Jon, envuélvela en una cláusula de uso.

10

No, no es así.

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

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

imprime

It returned null

De Process.Start Method (String) en MSDN (.NET Framework 4):

Si la dirección del archivo ejecutable para comenzar es una dirección URL, el proceso no es iniciado y se devuelve nulo.

(En general, sin embargo, la declaración using es la forma correcta de trabajar con objetos IDisposable. A excepción de WCF clients.)

+0

Incluso cuando el proceso del navegador ** ES ** comenzó, ¡todavía devuelve nulo! – AgentFire

+0

@AgentFire Siempre obtendrá nulo para una URL, ya sea que su navegador tenga que cargar o no. Ese es el punto: no tiene que deshacerse de este caso específico (URL). – TrueWill

2

@ respuesta de Fooberichu en el clavo, pero creo que también es importante señalar que por lo general, solo unas pocas cosas "necesitan" ser eliminadas explícitamente.

objetos siempre están dispuestos de manera efectiva en algunos punto:

  • Cada vez que el GC hace una colección, que se (con el tiempo) disponer de objetos que ya no se hace referencia. Por lo tanto, si no desecha manualmente, el objeto puede eliminarse en unos pocos segundos hasta que se salga del alcance.
  • Cuando se cierra la aplicación, se liberan todos los recursos que tenía. (Aunque es posible que C# /. Net no elimine los objetos, el sistema operativo reclamará prácticamente todo lo que su proceso haya obtenido.Si el tiempo de vida del recurso se extiende más allá de su aplicación, el sistema operativo es generalmente responsable de la limpieza para arriba)

El punto de eliminar manualmente (o el empleo de un 'utilizar') es, por tanto, no para garantizar que los recursos se liberará, pero a libérelos tan pronto como sea posible.

En estos días es poco probable que se quede sin la mayoría de los tipos de recursos (por ejemplo, memoria, identificadores de archivos o pinceles del sistema). Sin embargo, si se aferra a los recursos cuando no es necesario, es probable que su programa sea menos eficiente, puede usar más memoria de la necesaria, o tal vez causar demoras bloqueando temporalmente que otras aplicaciones hagan cosas útiles, etc. En general, entonces, la eliminación consiste en la buena etiqueta, la limpieza y la eliminación de ineficiencias innecesarias.

Hay algunos casos en los que se deben liberar los recursos (por ejemplo, si no cierra un archivo, no puede abrir/cambiar el nombre/moverlo o eliminarlo de ningún otro lugar de su programa u otros programas; siga asignando texturas en su tarjeta gráfica sin soltarlas, se quedará sin VRAM y la pantalla de la computadora fallará), pero en general, encontrará estas situaciones con poca frecuencia, y si sigue las mejores prácticas (eliminando objetos explícitamente cuando ya no es necesario), generalmente no necesitará saber cuándo se producen estas situaciones porque ya las tratará correctamente.

+2

En muchos casos las clases descartables no tienen finalizadores. Si son eliminados por GC sin ser ** explícitamente eliminados, se filtrará cualquier recurso no administrado asociado a ellos. Las clases marco hacen un buen trabajo al protegernos en la mayoría de los casos, pero la mejor práctica es eliminar siempre los objetos identificables. Esto y los clientes de WCF resultan ser dos casos extremos extraños. – TrueWill

Cuestiones relacionadas