Вызов метода в представлении модели вызова, который занимает / занимает много времени - PullRequest
0 голосов
/ 14 января 2011

Привет, я пытаюсь решить эту ситуацию.У меня есть приложение WPF с дизайном MVVM.Я использую Caliburn Micro framework и на MEF впрыскивания.

В приложении WPF я использую сервис из внешней сборки.Работает хорошо.

Проблема есть.Я привязываю наблюдаемый словарь к списку.Список может содержать от 0 до 400 элементов.У меня есть шаблон данных в элементе списка, он состоит из изображения и сома.Listbox похож на список контактов в скайпе или Google Talk.

Я каждые 3-4 секунды вызываю метод из сервиса, который возвращает новые данные в виде словаря.А с этими данными aj обновляет список.

Мой код выглядит в виде модели следующим образом:

      private DispatcherTimer _dispatcherTimer;
            private MyObservableDictionary<string, UserInfo> _friends;
            //temp
            private MyObservableDictionary<string, UserInfo> _freshFriends;

    //bind on listbox
            public MyObservableDictionary<string, UserInfo> Friends
            {
                get { return _friends; }
                set
                {
                    _friends = value;
                    NotifyOfPropertyChange(() => Friends);
                }
            }

    //in constructor of view model I have this:
                _dispatcherTimer = new DispatcherTimer();
                _dispatcherTimer.Tick += DispatcherTimer_Tick;
                _dispatcherTimer.Interval = TimeSpan.FromSeconds(3);
                _dispatcherTimer.Start();

// on timer tick I call method from service
        private void DispatcherTimer_Tick(object sender, EventArgs eventArgs)
        {

            //get new data from server
            //method GetFriends take much of time
            _freshFriends = _service.GetFriends(Account);

            //delete old data
            _friends.Clear();

            //refresh
            foreach (var freshFriend in _freshFriends)
            {
                Friends.Add(freshFriend);

            }
        }

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

Как можно решить эту проблему?В приложении winforms я использую фоновый рабочий, но это мое первое приложение WPF с MVVM.Существуют ли какие-либо «патерны» или «конструкторские» методы вызова метода, которые занимают много времени в классе модели представления?Вызовите этот метод в другом потоке?

1 Ответ

0 голосов
/ 14 января 2011

Как уже предлагали другие, вы можете использовать BackgroundWorker в приложении WPF или, если вы используете .NET 4, то использовать Task Parallel Library .У Стивена Клири есть хороший пост на TPL по сравнению с BackgroundWorker здесь - http://nitoprograms.blogspot.com/2010/06/reporting-progress-from-tasks.html

...