2012-07-17 8 views
6

Uno de mi clase recopila estadísticas durante la ejecución de la aplicación y quiero almacenar estas estadísticas en el disco cuando finaliza la aplicación. Nunca destruyo esta clase dentro de mi programa, así que he tratado de registros de almacén para presentar así:manera correcta de almacenar información en el archivo cuando se cierra la aplicación

~Strategy() 
    { 
     foreach(var item in statisticItems) 
     { 
      log.WriteLine(item.Text); // log is AutoFlush 
     } 
    } 

Sin embargo, no veo registros espero ver y también no puede "contagiarse" de momento depurador cuando destructor llamado.

Preguntas:

  • ¿Por qué en depurador no puede ponerse al momento en que el destructor se llama? ¿No se debe invocar a destructor para cada objeto cuando finaliza el programa?
  • ¿Qué debo usar para registrar mis cosas?
+0

¿Estás cerrando el depurador con el botón de parada por casualidad? – Blindy

+0

@Blindy no, solo cierro la ventana – javapowered

+0

¿Se ha instanciado 'Strategy'? ¿Es una clase estática (o estás utilizando solo sus métodos estáticos)? Danos más información, casos de uso, cualquier cosa que puedas. Puede descontar un error en el marco de su problema, es algo en su código, y solo podemos adivinar en este punto. – Blindy

Respuesta

1

El destructor (o Finalizer) no es el lugar para poner el código de esa manera. Está diseñado para liberar recursos no administrados. Los destructores se llaman de forma no determinista, por lo que no puede confiar en que ninguno de sus objetos sea válido dentro del destructor. Y no puede atraparlo en el depurador porque se llama en un subproceso separado, en circunstancias muy especiales. En resumen, no use destructores, a menos que sepa que lo necesita.

La forma ideal para iniciar sesión en la aplicación es simplemente colocar el código de registro al final del método Main. Debe asegurarse de capturar y registrar cualquier excepción que se genere, y si ese es el caso, puede iniciar sesión al final de Main.

Habrá algunos casos límite en los que no podrá iniciar sesión debido a errores como un desbordamiento de pila.En esos casos, deberá confiar en los registros de lo que sucedió antes del error.

+0

Aunque es un buen consejo, nada de esto responde a su pregunta real ... – Blindy

+0

Responde a la pregunta "¿Qué debería usar para registrar mis cosas?" –

+0

Ahora aborda la otra pregunta también. –

-1

No confíe en los destructores. Yo recomendaría usar algo como esto:

[STAThread] 
static void Main() 
{ 
    using(new Strategy()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class Strategy : IDisposable 
{ 
    public void Dispose() 
    { 
     WriteLogs() 
    } 
    ... 
} 

De esta manera, está seguro de que sus registros estarán escritos.

El vacío estático principal se copia del programa.cs predeterminado que se crea al crear una aplicación de formularios de Windows.

+0

-1 para promocionar el patrón desechable incorrecto. No deberías meterse con este, usa el trato real. – Blindy

+0

¿Por qué está usando el atributo 'STAThread' que pertenece a COM afaik? ¿Por qué no debería confiar en destructor? – javapowered

+0

'Desechable' es una optimización sobre destructores (y el patrón adecuado incluye un destructor de todos modos), su principal ventaja es que le permite liberar recursos bajo demanda. – Blindy

-1

Esta es no una respuesta completa (aún), pero mira esto:

El programador no tiene control sobre cuando se llama al destructor porque esto está determinado por el recolector de basura. El recopilador de basura busca objetos que ya no se utilizan en la aplicación . Si considera que un objeto es elegible para su destrucción, llama al destructor (si existe) y recupera la memoria utilizada para almacenar el objeto . Los destructores también son llamados cuando el programa sale.

Fuente: MSDN

Si se trata de una aplicación de consola, que podría intentar llamar a Environment.Exit(0); para ver lo que sucede?

Mantengamos esta respuesta actualizada, ya que esta es una pregunta interesante. Cualquiera se siente libre de editar.

Saludos

+0

Si desea una respuesta tipo wiki, la respuesta wiki de la comunidad es el camino a seguir. –

+0

@KendallFrey si no quiere editar, no es necesario. Aún así, hice una pregunta al OP y estoy esperando los comentarios para mejorar mi respuesta. Mejor que solo decir "estás equivocado, deberías hacerlo de esta manera" –

+0

Los comentarios son el lugar para hacer preguntas sobre el OP. Las respuestas son para respuestas. –

Cuestiones relacionadas