Tengo un problema en el que una aplicación en la que estoy trabajando tiene pérdidas de memoria. La experiencia me ha enseñado que uno de los primeros lugares en los que los lenguajes recogidos de basura experimentan fugas de memoria es el de suscribirse a eventos y no cancelar su suscripción más tarde. El segundo tiene que ver con el almacenamiento de estado estático. Soy nuevo en C# y me he sentido frustrado por el tipo de evento opaco.¿Cómo averiguas qué está suscrito a un evento en C#?
Hemos atrapado algunos errores de suscripción doble por suerte, pero la aplicación realmente usa eventos para una serie de cosas. Si bien somos conscientes del principio de cancelar la suscripción de todo lo que suscribe, todavía hay pérdidas de memoria. Me gustaría determinar sistemáticamente qué está suscrito a qué.
Editar:
Gracias por el puntero al método GetInvocationList()
. Estoy intentando crear un arnés de depuración que arrojará los resultados dinámicamente. El problema es que las soluciones que encontré funcionaban en .Net 2, pero ya no en .Net 3.5. Básicamente, le indica que obtenga el FieldInfo correspondiente para EventInfo (reflection, GetField y GetEvents, respectivamente). Sin embargo, en .Net 3.5 no hay FieldInfo correspondiente, y EventInfo no me permitirá obtener la lista de invocación.
Solo quiero descargar la lista de eventos y su InvocationList para fines de depuración.
Consulte mi respuesta, C# Event Based Memory Leaks, a una pregunta similar del mes pasado. –
Tuve un momento difícil para elegir cuál de los dos debería obtener la respuesta "oficial" porque ambos abordaron diferentes partes de mi necesidad. Al final elegí el que respondía la pregunta en el título, aunque la respuesta de n8wrl era igual de buena de diferentes maneras. –