Manejo de eventos con un delegado anónimo.

Para el registro: encontré una pregunta similaraquí Pero tengo que elaborar un poco más sobre el tema.

Mi escenario concreto es el siguiente:

En Silverlight 4, ThemyFrameworkElement.FindName("otherElementName") El método parece funcionar bien ahora, pero encontré un problema. Todavia vuelvenull cuando el elemento aún no se ha agregado al árbol visual obviamente.

Pero ahora necesito esta funcionalidad en unDependencyPropertyesPropertyChangedCallback de una costumbreUserControl entrenador de animales. En este ámbito, es incierto si el UserControl se agrega al árbol visual todavía. Pero debo ejecutar cierta acción en otro elemento del árbol. Cuando el elemento ya está disponible, puede y debe hacerse en este momento. Si no es así, debe hacerse inmediatamente cuando esté disponible. Entonces 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 paraname yresultAction dentro del manipulador. Luego me doy de baja del evento dentro del controlador porque soy un tipo inteligente y limpio y no quiero fugas. Tampoco quiero romper ninguna mosca sobre ruedas con algunas fábricas de objetos débiles o similares.

Ahora esto funciona sin problemas hasta ahora. Pero tengo algunas preguntas.

¿Es este generalmente un enfoque lo suficientemente limpio como para cancelar la suscripción del controlador de eventos dentro del controlador? ¿O eso va a matar a un cachorro inocente eventualmente?¿Podría haber algunos problemas como algunas fugas debido al uso de variables de alcance externo dentro del delegado anónimo?¿Puede haber problemas de sincronización de subprocesos que me hagan "perder" laLoaded ¿evento? En este escenario especial, solo debe estar involucrado el subproceso de UI del Silverlight. Pero si es un problema de todos modos, y / o si necesito una funcionalidad similar en un escenario no relacionado con la interfaz de usuario, ¿cuál es el mejor enfoque para f1x0r?

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

Respuestas a la pregunta(1)

Su respuesta a la pregunta