una sharp que net manejo librería eventos evento deshabilitar crear biblioteca .net events anonymous-delegates

.net - sharp - vb net eventos



Manejo de eventos con un delegado anónimo (1)

Para que quede constancia: encontré una pregunta similar aquí, pero tengo que profundizar un poco más en el tema.

Mi escenario concreto es este:

En Silverlight 4, el myFrameworkElement.FindName("otherElementName") parece funcionar bien ahora, pero encontré un problema. Todavía devuelve null cuando el elemento aún no se ha agregado al árbol visual, obviamente.

Pero ahora necesito esta funcionalidad en PropertyChangedCallback de DependencyProperty de un controlador UserControl personalizado. En este ámbito, es incierto si el UserControl se agrega al árbol visual todavía. Pero debo ejecutar una determinada acción en otro elemento del árbol. Cuando el elemento ya está disponible, puede y debe hacerse ahora mismo. De lo contrario, debe hacerse inmediatamente cuando esté disponible. Así que se me ocurrió este método de extensión que puedo llamar así:

myFrameworkElement.FindNameEnsured("otherElementName", result => this.DoSomethingWith(result));

El código para el método de extensión es el siguiente:

static public void FindNameEnsured(this FrameworkElement self, string name, Action<object> resultAction) { if (self != null && resultAction != null) { object result = self.FindName(name); if (result != null) { resultAction(result); } else { RoutedEventHandler handler = null; handler = (sender, e) => { result = self.FindName(name); resultAction(result); self.Loaded -= handler; }; self.Loaded += handler; } }

Como puede ver, debo usar un delegado anónimo porque necesito los valores para name y resultAction dentro del controlador. Luego voy a cancelar la suscripción del evento dentro del controlador porque soy un tipo inteligente y limpio y no quiero que se filtre nada. Tampoco quiero romper las moscas sobre ruedas aquí con algunos objetos de fantasía WeakEventFactories o cosas similares.

Ahora esto funciona sin problemas hasta el momento. Pero tengo algunas preguntas.

  1. ¿Es este un enfoque generalmente lo suficientemente limpio como para darse de baja del controlador de eventos dentro del controlador? ¿O va a matar a un cachorro inocente con el tiempo?
  2. ¿Podría haber algunos problemas como alguna fuga debido al uso de variables de ámbito externo dentro del delegado anónimo?
  3. ¿Puede haber problemas de sincronización de hilos que me hagan "perder" el evento Loaded ? En este escenario especial, solo el hilo del distribuidor de UI de Silverlight debería estar involucrado. Pero si de todos modos es un problema, y ​​/ o si necesito una funcionalidad similar en un escenario no relacionado con UI, ¿cuál es el mejor enfoque para f1x0r?

Gracias por su paciencia y tiempo leyendo mis largas elaboraciones. ;-)


  1. Eso debería estar bien, aunque es un poco doloroso. LINQ to Rx tiene una idea más IDisposable de desuscripción: cuando se suscribe, se le entrega un IDisposable que IDisposable la suscripción cuando lo IDisposable . Sin embargo, eso no se ajusta al modelo de eventos existente.
  2. No creo que tenga ninguna fuga en este caso particular: existen algunas condiciones límite en las que dos funciones anónimas diferentes que usan variables en el mismo ámbito pueden terminar capturando variables que no requieren, pero realmente es una ventaja caso.
  3. Tendría que dar detalles más exactos sobre la situación hipotética: qué le preocupaba exactamente, cómo se implementa el evento, etc.