Шаблон для извлечения и отображения иерархических данных с использованием асинхронных вызовов?

#silverlight #data-binding #asynchronous #design-patterns #hierarchical-data

#silverlight #привязка данных #асинхронный #шаблоны проектирования #иерархические данные

Вопрос:

Контекст Silverlight / WPF, C #, .NET 4,

У меня есть 4-уровневое глубокое дерево эскизов, которое мне нужно перечислить и отобразить каким-либо значимым образом. Для синхронного выполнения (последовательный мир) мы могли бы подумать следующим образом:

     Channels = Channels_Build("CHANNELS.XML");
    foreach Ch in Channels
    {
         Cats = Cats_Build( Ch.URL ) ;
         foreach Cat in Cats
         {
             PLs = PLs_Build( Cat.URL ) ;
             foreach PL in PLs
             {
                  Medias = Medias_Build( PL.URL ) ;
                  foreach Media in Medias 
                              display Media image
             }
       }
 }
  

.
Однако у меня есть модель асинхронной загрузки для XML, изображений, …, поэтому я думаю о чем-то вроде этого:

 Channels_Build("CHANNELS.XML");
Channels_Loaded()
{   // Channels build from some returned XML
    foreach Ch in Channels
        Cats_Build( Ch.URL, ??? ) ;   //async calls
}
Cats_Loaded()
{   // Cats build from some returned XML
    foreach Cat in Cats
        PLs_Build( Cat.URL ... ) ;
}
PLs_Loaded()
{   // PLs build from some returned XML
    foreach PL in PLs
        MediaList_Build( PL.URL ... ) ; 
}
MediaList_Loaded()
{   // MediaList build from some returned XML
    foreach media in MediaList
        display Media image 
}
  

Каждый из Channels_Build, Cats_Build, PLs_Build, MediaList_Build выполняет асинхронный вызов и, следовательно, имеет связанный обратный вызов xxx_Loaded()

Каждый канал имеет 1 или более категорий. Каждая категория содержит 1 или более списков воспроизведения. Каждый плейлист содержит 1 или более носителей, таким образом, у меня есть иерархическая структура глубиной в 4 уровня

Можно предположить, что Channels, Cats, PLS и MediaList имеют общий базовый класс.

Должен ли я объединить эту логику 4x в единый метод рекурсивной сборки? Как? Мне пришлось бы заставить процесс сборки передавать некоторую информацию (родительский узел) соответствующему обратному вызову (я посмотрел IAsyncResult.AsyncState)

Мой мозг заблокирован, и я не могу придумать, что здесь нужно? рекурсия?, передача информации в асинхронные вызовы, конкретный шаблон?, …

Должен ли я сначала собрать данные дерева в памяти в одну структуру? или это было бы полезно, только если я решу использовать элемент управления TreeView? Что, если я решу отобразить информацию, используя повторяющийся шаблон, например, в listbox. Шаблон отображал бы:

 Channel-Image Name
        Category-Image Name
                PlayList-Image Name
                        MediaList images...
  

Да, нелистовые узлы будут визуально повторяться в конце списка. Это нормально, поскольку это может предоставить карту, которую я ищу.

Итак, остается загадочный вопрос: как мне перечислить и отобразить все узлы в этой асинхронной модели?

Спасибо.

Ответ №1:

Я бы посмотрел на асинхронное обновление CTP, которое значительно упрощает этот материал