2012-07-31 8 views
0

Je suis en mesure d'accéder à la liste (ListData) valeur de sa classe, mais si j'essaie de référencer la liste depuis l'extérieur de la classe, elle l'affiche comme une liste vide.Pourquoi la liste est vide?

J'ajoute des objets à ListData dans la méthode getVideoList.

J'ai ajouté ce morceau de code et cela fonctionne maintenant (méthode de scrutation), Est-ce inefficace?

IAsyncResult result = request.BeginGetResponse(new AsyncCallback(getVideoList), state); 
      while (result.IsCompleted == false) 
      { 
       Thread.Sleep(1000); 
      } 

Public class otherclass{ 
    static void main(string [] args){ 
     RestProcess process = new RestProcess(videoListURI); 
     process.initilaizeRest(); 

     foreach (VideoSeriesElement ele in process.ListData) 
     { 
     Console.WriteLine(ele.id); 
     Console.WriteLine(ele.title); 
     Console.WriteLine(ele.href); 
     Console.WriteLine(ele.image); 
     } 

     Console.ReadLine(); 
    } 

} 

public class RestProcess 
{ 
    /// <summary> 
    /// Default constructor 
    /// </summary> 
    /// 
    readonly string blankimage = "http://images1.test.com/properties/NoThumbnail_HD.jpg"; 
    public RestProcess(string uri) 
    { 
     URI = uri; 
     ListData = new ObservableCollection<VideoSeriesElement>(); 
    } 
    public ObservableCollection<VideoSeriesElement> ListData{get;set;} 


    public void initilaizeRest() 
    { 
     WebRequest request = HttpWebRequest.Create(URI); 
     request.Method = "GET"; 

     // RequestState is a custom class to pass info to the callback 
     RequestState state = new RequestState(request, URI); 
     IAsyncResult result = request.BeginGetResponse(new AsyncCallback(getVideoList), state); 
    } 

    public string URI{get;set;} 

    /// <summary> 
    /// getVideoList 
    /// </summary> 
    /// <param name="result"></param> 
    public void getVideoList(IAsyncResult result) 
    { 
     RequestState state = (RequestState)result.AsyncState; 
     WebRequest request = (WebRequest)state.Request; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(result); 

     try 
     { 
      TextReader textreader = new StreamReader(response.GetResponseStream()); 
      XDocument doc = XDocument.Load(textreader); 


      foreach(XElement videoSeriesEle in doc.Descendants("video-series")) 
      { 
       var videseriesEle = new VideoSeriesElement();  
       videseriesEle.id = videoSeriesEle.Attribute("id").Value; 
       videseriesEle.href = videoSeriesEle.Attribute("href").Value; 
       videseriesEle.title = videoSeriesEle.Element("title").Value; 

       if (!videoSeriesEle.Element("images").IsEmpty && videoSeriesEle.Element("images").Elements("image") != null) 
       { 
        var imagelist = videoSeriesEle.Element("images").Elements("image").ToList(); 
        foreach (var ele in imagelist) 
        { 
         if (ele.Attribute("styleid").Value.Equals("5")) 
         { 
          if (videoSeriesEle.Element("images").Element("image").Attribute("href").Value != null) 
          { 
           videseriesEle.image = videoSeriesEle.Element("images").Element("image").Attribute("href").Value; 
          } 

         } 
        } 

       } 
       else { videseriesEle.image = blankimage; } 


       //add object to list 
       ListData.Add(videseriesEle); 

      } 

      //Close streams 
      textreader.Close(); 
      response.Close(); 
     } 
     catch (XmlException e) 
     { 
      Console.WriteLine(e); 
     } 

    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="state"></param> 
    /// <param name="timedOut"></param> 
    private static void ScanTimeoutCallback(object state, bool timedOut) 
    { 
     if (timedOut) 
     { 
      RequestState reqState = (RequestState)state; 
      if (reqState != null) 
       reqState.Request.Abort(); 
      Console.WriteLine("aborted- timeout"); 
     } 
    } 
} 

Répondre

2

La méthode RestProcess.initilaizeRest() demande les données via un IAsyncResult, ce qui signifie l'appel pour obtenir les données est asynchrone. Dans votre classe otherClass, vous essayez de traiter et de boucler l'élément ListData immédiatement après avoir appelé initilaizeRest() et il y a de très fortes chances que les données ne soient pas encore chargées.

Pour résoudre ce problème, vous devez disposer d'un gestionnaire de rappel/événement dans le otherClass qui est à l'écoute lorsque les données sont remplies.

+0

Pourriez-vous me diriger vers Documentation sur callback/event-handler? – Fabii

1

Vous pouvez exposer le résultat IAsyncResult en tant que propriété à partir de l'appel request.BeginGetResponse dans RestProcess et le bloquer dans otherClass jusqu'à ce que la propriété IAsyncResult.IsCompleted soit true ou utiliser le WaitHandle exposé par celui-ci, mais existe-t-il une raison? utilisant l'appel asynchrone BeginGetResponse plutôt que l'appel synchrone GetResponse?

+0

Je ne crois pas que GetResponse soit supporté sur Xbox360 – Fabii

+1

Désolé, je ne savais pas que vous étiez en train de développer pour la 360. Cochez ici quelques exemples de la façon dont vous pouvez utiliser quelque chose implémentant le pattern async comme BeginGetRespoonse: http: // www.dotnetcurry.com/ShowArticle.aspx?ID=642 - interrogation et rappels. – Cashley

+0

Merci beaucoup. – Fabii

Questions connexes