Обработка событий с анонимным делегатом

Для записи: я нашел похожий вопросВот но я должен подробнее остановиться на этом вопросе.

Мой конкретный сценарий таков:

В Silverlight 4, ThemyFrameworkElement.FindName("otherElementName") Кажется, что метод работает нормально, но я столкнулся с проблемой. Все еще возвращаетсяnull когда элемент еще не добавлен в визуальное дерево, очевидно.

Но теперь мне нужен этот функционал вDependencyPropertyPropertyChangedCallback обычаяUserControl обработчик. В этой области пока неизвестно, добавлен ли UserControl в визуальное дерево. Но я должен выполнить определенное действие над другим элементом дерева. Когда элемент уже доступен, это можно и нужно сделать прямо сейчас. Если нет, то это должно быть сделано немедленно, когда это доступно. Итак, я придумал этот метод расширения, который я могу назвать так:

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

Код для метода расширения выглядит следующим образом:

    static public void FindNameEnsured(this FrameworkElement self,
            string name, Action 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;
            }
        }

Как видите, я должен использовать анонимного делегата, потому что мне нужны значения дляname а такжеresultAction внутри обработчика. Затем я иду отписаться о событии внутри обработчика, потому что яя умный и чистый парень и не хочу никаких утечек. Я тоже неЯ не хочу разбивать мух на колесах с помощью каких-нибудь причудливых WeakEventFactories или подобных вещей.

Пока это работает без сбоев. Но у меня есть несколько вопросов.

Это вообще достаточно чистый подход, чтобы отписаться от обработчика событий внутри обработчика? Или это в конечном итоге убьет невинного щенка?Могут ли быть некоторые проблемы, такие как утечка из-за использования внешних переменных области действия внутри анонимного делегата?Могут ли быть проблемы с синхронизацией потоков, которые заставили бы меня "Мисс" Loaded событие? В этом особом сценарии только Silverlights Поток диспетчера пользовательского интерфейса должен быть вовлечен. Но если этоВ любом случае это проблема, и / или если мне нужны аналогичные функции в сценарии, не связанном с пользовательским интерфейсом, что?s лучший подход к f1x0r это?

Спасибо уже за ваше терпение и время, прочитав мои длинные разработки. ;-)

Ответы на вопрос(1)

Ваш ответ на вопрос