Обновите экземпляр в первом методе, прежде чем продолжить выполнение второго метода в той же команде - PullRequest
0 голосов
/ 04 октября 2011

У меня есть такой метод

public void LoadProgrammeListFromChannel(TVDailyScheduleParam scheduleParam, Action callback)
        {
            string url = Helper.GetProgrammeUrl(scheduleParam.Day, scheduleParam.Channel.Id); //1//
            WebClient client = new WebClient(); //2//

            client.OpenReadCompleted += new OpenReadCompletedEventHandler((sender, e) => //3//
            {//5//
                if (e.Error != null)
                    return;

                try
                {
                    _programmeList.Clear();
                    _programmeList = DataService.GetProgrammeList(e.Result);
                    // call method in MainVM to update View
                    callback();
                }
                finally
                {
                    // close file stream
                    e.Result.Close();
                }
            });

            client.OpenReadAsync(new Uri(url, UriKind.Absolute)); //4//
        }

, и у меня есть такая команда

LoadWhatsonProgrammeCommand = new RelayCommand(()=>
            {
                foreach (TVDailyScheduleParam param in _tvDailyScheduleVM.ChannelList.Select(c => new TVDailyScheduleParam(DateTime.Today, c, false)))
                {
                    TVDailyScheduleParam param2 = param;

                    _tvDailyScheduleVM.LoadProgrammeListFromChannel(param2, ()=>
                    {
                        RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
                    });

                    _tvDailyScheduleVM.GetWhatsonProgramme(param2, ()=>
                    {
                        RaisePropertyChanged(TV_DAILY_SCHEDULE_VM);
                    });
                }
            });

Теперь, когда я вызываю команду.Сначала он запускает _tvDailyScheduleVM.LoadProgrammeListFromChannel и вызывает метод LoadProgrammeListFromChannel.

В методе LoadProgrammeListFromChannel он работает с 1 -> 2 -> 3. На 3 он не завершен, так что он работает до 4 изатем вернитесь к команде и продолжайте выполнять _tvDailyScheduleVM.GetWhatsonProgramme.

Но _programmeList in LoadProgrammeListFromChannel не обновляется, поэтому GetWhatsonProgramme не запускается точно.

Как я могу вернуться к LoadProgrammeListFromChannel, чтобы запустить 3 и обновить _programmeList доработает _tvDailyScheduleVM.GetWhatsonProgramme?

1 Ответ

0 голосов
/ 09 октября 2011

Поведение, которое вы описываете, «по замыслу».Ваш метод LoadProgrammeListFromChannel выполняет асинхронный вызов.Это означает, что в вашем методе последовательность имеет вид 1 -> 2 -> 3 -> 4 -> return -> выполнить код в вызывающей функции -> затем некоторое время спустя 5 и затем обратный вызов.* и GetWhatsonProgramme выполняются параллельно.Так что если GetWhatsonProgramme необходимо всегда для запуска после LoadProgrammeListFromChannel, у вас будет вызов для перемещения GetWhatsonProgramme в ваш метод обратного вызова, т.е.PropertyChangedEvent вашего ViewModel и, если свойство TV_DAILY_SCHEDULE_VM было изменено, вызовите GetWhatsonProgramme оттуда, хотя это может быть нежелательно.

...