2011-10-04 39 views
0

我有這樣更新實例之前,繼續在同一命令

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

一個cammand現在,當我調用該命令。起初它運行_tvDailyScheduleVM.LoadProgrammeListFromChannel並調用LoadProgrammeListFromChannel方法。

LoadProgrammeListFromChannel方法中,它從1 - > 2 - > 3運行。在3時,它沒有完成,它運行到4,然後返回到命令並繼續運行_tvDailyScheduleVM.GetWhatsonProgramme

但是_programmeList in LoadProgrammeListFromChannel沒有更新,因此GetWhatsonProgramme沒有完全運行。

如何在運行_tvDailyScheduleVM.GetWhatsonProgramme之前回到LoadProgrammeListFromChannel以運行3更新_programmeList

回答

0

您描述的行爲是「按設計」。您的方法LoadProgrammeListFromChannel進行異步呼叫。這意味着在你的方法中,順序是1 - > 2 - > 3 - > 4 - > return - >在調用函數中執行代碼 - >然後在某個時間5之後再回調。

因此LoadProgrammeListFromChannelGetWhatsonProgramme並行執行。所以,如果GetWhatsonProgramme需求總是LoadProgrammeListFromChannel運行後,你將有動議GetWhatsonProgramme到您的回調方法,即

LoadWhatsonProgrammeCommand = new RelayCommand(()=> { 
    var channelList = _tvDailyScheduleVM 
          .ChannelList 
          .Select(c => new TVDailyScheduleParam(
           DateTime.Today, 
           c, 
           false 
         )); 

    foreach (TVDailyScheduleParam param in channelList) { 
     TVDailyScheduleParam param2 = param; 

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

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

或者,你可以訂閱你的視圖模型的PropertyChangedEvent如果TV_DAILY_SCHEDULE_VM財產已改變,從那裏打電話GetWhatsonProgramme,雖然這可能不是渴望的。