[英]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.