从异步httpwebrequest填充列表框

时间:2011-10-13 20:32:48

标签: c# xml linq windows-phone-7.1

我目前正在做一个抓取XML文档的小项目,通过Linq解析(挑选某些元素),然后通过异步httpwebrequest将其绑定到列表框。

这是代码;

 void ResponseCallBack(IAsyncResult result)
    {
        //get to the request object
        HttpWebRequest myRequest = result.AsyncState as HttpWebRequest;
        try
        {
            //need error checking
            HttpWebResponse response = myRequest.EndGetResponse(result)
                as HttpWebResponse;
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {
                String s = sr.ReadToEnd();

                XElement xmlSearch = XElement.Parse(s);
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
                {

                    lstbBouquets.ItemsSource = from Search in xmlSearch.Descendants("e2service")
                                               select new GetBouquets
                                               {

                                                   e2servicename = Search.Element("e2servicename").Value
                                               };
                });

                //System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(s); });


                // Stop progress bar
                System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { performanceProgressBar.IsIndeterminate = false; });

            }
        }
        catch (WebException webExcp)
        {
            //Debug only, needs error checking
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => { Debug.WriteLine(webExcp.ToString()); });
        }
    }

我是否正确使用调度程序与UI线程交谈以更新列表框?执行时,列表框什么都没有,我从VS获得以下输出;

  

mscorlib.dll中出现'System.MethodAccessException'类型的第一次机会异常   'UI Task'(托管):已加载'System.SR.dll'   mscorlib.dll中出现“System.IO.FileNotFoundException”类型的第一次机会异常   System.Windows.Data错误:无法从'DreamboxRemote.Pages.GetBouquets'(类型'DreamboxRemote.Pages.GetBouquets')获取'e2servicename'值(类型'System.String')。 BindingExpression:Path ='e2servicename'DataItem ='DreamboxRemote.Pages.GetBouquets'(HashCode = 98879357); target元素是'System.Windows.Controls.TextBlock'(Name =''); target属性为'Text'(类型'System.String').. System.MethodAccessException:尝试访问该方法失败:DreamboxRemote.Pages.GetBouquets.get_e2servicename()      在System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化,StackCrawlMark& stackMark)      在System.Reflection.RunA mscorlib.dll中出现'System.MethodAccessException'类型的第一次机会异常

我认为我没有正确处理线程,但看不到哪里?

编辑:我应该注意,当取消注释调试写入时,它会正确输出完整的xml文档。

2 个答案:

答案 0 :(得分:2)

我怀疑问题出在linq声明的封闭上 你不能以这种方式绑定ItemsSource。

我将从linq语句中获取输出并将其设置为属性,然后在获得数据后更新teh UI线程上的实际itemssource。

 Bouquets = from Search in xmlSearch.Descendants("e2service") 
            select new GetBouquets 
            { 
                e2servicename = Search.Element("e2servicename").Value 
            }; 

System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() => 
{ 
    lstbBouquets.ItemsSource = Bouquets;
}); 

答案 1 :(得分:0)

  Search.Element("e2servicename")

可能为null,或

  Search.Element("e2servicename").Value

可能会返回null。显式转换运算符(字符串或Nullable)优先于.Value属性以处理可能的null。

您可以阅读有关here的更多信息。

  e2servicename = (string) Search.Element("e2servicename")