2012-07-31 259 views
0

我能够访问其类中的列表(ListData)value,但是如果我尝试从类的外部引用列表,它会将其显示为空列表。为什么列表为空?

我在getVideoList方法中将对象添加到ListData中。

我添加了这段代码,它现在可以工作(轮询方法),这是不是很方便?

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

回答

2

RestProcess.initilaizeRest()该方法经由IAsyncResult请求数据,这意味着调用来获取数据是异步的。在您的otherClass课程中,您尝试在呼叫initilaizeRest()后立即处理并循环访问ListData元素,并且很有可能数据尚未加载。

要解决这个问题,您应该在otherClass中有一个回调/事件处理程序,用于监听数据何时填充。

+0

可以指导我回顾/事件处理程序的文档? – Fabii 2012-07-31 20:46:46

1

您可以在RestProcess中的request.BeginGetResponse调用中暴露IAsyncResult结果,并在其他类中阻止该属性,直到IAsyncResult.IsCompleted属性为true,或者使用它公开的WaitHandle,但有没有原因使用异步BeginGetResponse调用而不是同步GetResponse调用?

+0

我不相信Xbox360支持GetResponse – Fabii 2012-07-31 20:21:21

+1

对不起,我没有意识到您正在为360开发。请查看这里的几个示例,了解如何使用实现像BeginGetRespoonse这样的异步模式的东西:http:// www.dotnetcurry.com/ShowArticle.aspx?ID=642 - 投票和回调。 – Cashley 2012-07-31 20:58:33

+0

非常感谢。 – Fabii 2012-07-31 21:26:15

相关问题