Лучший способ заполнить список из WS Async в WP7 - PullRequest
1 голос
/ 10 ноября 2011

У меня есть элемент управления Panorama с 8 PanoramaItems, каждый из которых содержит LongListSelector. При использовании MVVM список связывается со свойством ObservableCollection.

Мне нужно заполнить каждый список данными (много фото, текст ...) с веб-сервера.

Как мне сделать это наилучшим образом, не блокируя поток пользовательского интерфейса?

Я пробовал что-то вроде этого

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

Где функция загрузки выглядит так:

[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();
}

Это работает, но интерфейс все еще заморожен.

Как я могу сделать это лучше?

Полагаю, проблема в том, что я использую LongListSelector, поэтому мне нужно сразу добавить все данные в List1Items для LongListSelector для правильной группировки.

РЕДАКТИРОВАТЬ: в Windows Phone Toolkit есть ошибка - ноябрь 2011 г. (7.1 SDK) пробуждение LongListSelector к группировке неправильно!

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Часть этого, которая блокирует поток пользовательского интерфейса, - это место, где вы устанавливаете List1Items как полный набор результатов, попробуйте разбить его на несколько вставок, скажем, 5 или 10 за раз. Я пишу это со своего телефона, поэтому трудно привести пример кода, но похоже, что вы контролируете часть кода и просто нуждаетесь в ударе Лилля в правильном направлении.

0 голосов
/ 10 ноября 2011

Вы должны рассмотреть Реактивные расширения для 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);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...