簡體   English   中英

從WP7中的WS Async填充列表的最佳方法

[英]Best way to fill list from WS Async in WP7

我有一個帶有8個PanoramaItems的Panorama控件,每個控件包含一個LongListSelector。 使用MVVM,列表框綁定到ObservableCollection屬性。

我需要用來自Web服務器的數據(大量數據照片,文本..)填充每個列表。

如何以最佳方式做到這一點,而又不會阻塞UI線程?

我嘗試過這樣的事情

System.Threading.ThreadPool.QueueUserWorkItem(x => LoadList1());
System.Threading.ThreadPool.QueueUserWorkItem(x => LoadList2());
...

Load函數如下所示:

[EDIT] using Rx  
private IDisposable _disp;
private void LoadList1()
{
      _disp = Observable.FromEvent<PhotoEventArgs>(_webServer, "GetPhotosCompleted")
                        .Select(a => from l in a.EventArgs.Result
                                     where l.Name.Length > 1
                                     group l by l.Name.ToLower()[0] into c
                                             orderby c.Key
                                             select new Group<Photo>(c.Key, c))
                        .ObserveOnDispatcher()
                        .Subscribe(a =>
                        {
                             List1Items = new ObservableCollection<Group<Photo>>(a);
                             _disp.Dispose();
                        });

     _webServer.GetPhotosAsync();
}

它正在工作,但UI仍然在部分時間內處於凍結狀態。

我怎樣才能使其表現更好?

我猜問題是我使用LongListSelector,所以我需要一次將所有數據添加到List1Items中,以使LongListSelector分組正確。

編輯:Windows Phone Toolkit-2011年11月(7.1 SDK)中有一個錯誤,提示LongListSelector分組錯誤!

阻止UI線程的部分是將List1Items設置為整個結果集,並嘗試將其拆分為多個插入,例如一次插入5或10。 我正在用手機編寫此代碼,因此很難給您提供代碼示例,但看起來您已控制了編碼部分,只需要朝正確的方向踢里爾。

您應該考慮研究Windows Phone的反應式擴展

您的代碼最終看起來像這樣:

private void LoadList1()
{
    Observable.FromEvent<PhotoEventArgs>(
        e => new EventHandler(e),
        e => _webServer.GetPhotosCompleted += e,
        e => _webServer.GetPhotosCompleted -= e
    ).Select(e => 
    {
        return 
            from l in e.Result
            where l.Name.Length > 1
            group l by l.Name.ToLower()[0]
            into c
            orderby c.Key
            select new Group<Photo>(c.Key, c);
    })
    .SubscribeOnDispatcher()
    .Subscribe(result => 
    {
        foreach (var item in result)
            List1Items.Add(item);
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM