使用异步调用进行分层数据检索和显示的模式?

时间:2011-05-20 14:02:52

标签: silverlight data-binding asynchronous design-patterns hierarchical-data

Context 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个或多个媒体 因此,我有一个4级深层次结构

您可以假设Channels,Cats,PLs和MediaList共享一个公共基类。

我应该将这个4x逻辑折叠成一个递归构建方法吗?怎么样?我必须让构建过程将一些信息(父节点)传递给相应的回调(我查找了IAsyncResult.AsyncState)

我的大脑被锁住了,我想不出这里需要什么?递归?,将信息传递给异步调用,特定模式?,...

我应该先将内存中的树数据构建到一个结构中吗?或者只有在我决定使用TreeView控件时才有用?如果我决定使用重复模板将信息显示到列表框中,该怎么办?模板将显示:

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

是的,非叶节点将在列表中以可视方式重复。这很好,因为它可能提供我正在寻找的地图。

令人费解的问题仍然存在: 如何在此Async模型中进行枚举和显示所有节点?

谢谢。

1 个答案:

答案 0 :(得分:0)

我会看看异步CTP刷新,这简化了这个东西