我目前正在做一个抓取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文档。
答案 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")