Manipulação de eventos com um delegado anônimo

Para constar: eu encontrei uma pergunta semelhanteaqui mas tenho que elaborar um pouco mais sobre o assunto.

Meu cenário concreto é este:

No Silverlight 4, omyFrameworkElement.FindName("otherElementName") O método parece funcionar bem agora, mas encontrei um problema. Ainda retornanull quando o elemento ainda não foi adicionado à árvore visual, obviamente.

Mas agora eu preciso dessa funcionalidade em umDependencyPropertyéPropertyChangedCallback de um costumeUserControl manipulador. Nesse escopo, é incerto se o UserControl já foi adicionado à árvore visual. Mas devo executar uma certa ação em outro elemento da árvore. Quando o elemento já está disponível, ele pode e deve ser feito agora. Caso contrário, deve ser feito imediatamente quando estiver disponível. Então, eu vim com esse método de extensão que posso chamar assim:

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

O código para o método de extensão é assim:

    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 você pode ver, preciso usar um delegado anônimo porque preciso dos valores paraname eresultAction dentro do manipulador. Depois, desinscrevo o evento dentro do manipulador, porque sou um cara inteligente e limpo e não quero vazamento. Também não quero quebrar nenhuma mosca sobre rodas aqui com alguns WeakEventFactories extravagantes ou coisas semelhantes.

Agora isso funciona sem problemas até agora. Mas eu tenho algumas perguntas.

Isso geralmente é uma abordagem suficientemente limpa para cancelar a inscrição do manipulador de eventos dentro do manipulador? Ou isso acabará matando um filhote inocente?Poderia haver alguns problemas, como vazamento por causa do uso de variáveis de escopo externo dentro do delegado anônimo?Pode haver problemas de sincronização de threads que me levariam a "perder" oLoaded evento? Nesse cenário especial, apenas o encadeamento do UI do Silverlight deve estar envolvido. Mas se é um problema de qualquer maneira e / ou se eu precisar de uma funcionalidade semelhante em um cenário não relacionado à interface do usuário, qual é a melhor abordagem para f1x0r?

Desde já agradeço pela paciência e tempo lendo minhas longas elaborações. ;-)

questionAnswers(1)

yourAnswerToTheQuestion