0

我可以从其类中访问列表 ( ListData ) 值,但如果我尝试从类外部引用该列表,它会将其显示为一个空列表。

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

2 回答 2

2

RestProcess.initilaizeRest()方法通过 请求数据IAsyncResult,这意味着获取数据的调用是异步的。在您的otherClass类中,您尝试ListData在调用后立即处理和循环元素,initilaizeRest()并且很有可能尚未加载数据。

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

于 2012-07-31T20:03:13.653 回答
1

您可以在 RestProcess 中将 IAsyncResult 结果作为 request.BeginGetResponse 调用的属性公开,并在 otherClass 中阻塞,直到 IAsyncResult.IsCompleted 属性为真,或者使用它公开的 WaitHandle,但有理由使用异步 BeginGetResponse调用而不是同步 GetResponse 调用?

于 2012-07-31T20:12:56.867 回答