我想通过以下方法从Web读取XML文件。
public static async void Load_WinPhone(string URL)
{
HttpClient client = new HttpClient();
var httpResponseMessage = await client.GetAsync(new Uri(URL));
if (httpResponseMessage.StatusCode == System.Net.HttpStatusCode.OK)
{
var xmlStream = await httpResponseMessage.Content.ReadAsStreamAsync();
XDocument Xdoc = XDocument.Load(xmlStream);
var query = from data in Xdoc.Descendants("article")
select new MyClass
{
Title = data.Element("title").Value
}
foreach (MyClass x in query)
{
AnotherClass.List.Add(x);
}
}
这是Works,但在方法完成后,AnotherClass.List仍为空。 我认为这是因为异步,我在没有异步的控制台中尝试了这个并且它工作正常。 但现在我想在Windows Phone 8.1上使用此列表并且列表保持空白。
有人可以解释一下为什么甚至有解决方法吗?
答案 0 :(得分:2)
是的,这就是await
的工作方式 - 从调用者的角度来看,它与return
基本相同。因此,当您调用此方法时,很可能会在await
之前返回{ - {1}}。
您遇到的主要问题是您的方法是AnotherClass.List
- 您丢弃了有关方法执行的所有信息。相反,您希望返回async void
- 这允许您Task
方法或绑定延续。
每当你打破await
链时,你也会破坏代码的同步性。大多数时候(特别是在UI中),你希望await
一直到顶部 - 通常,唯一的事情await
是事件处理程序,即便如此,它只是因为事件处理程序< em>必须返回async void
。
总的来说,多线程和异步代码是一个相当大的主题 - http://www.albahari.com/threading/是理解大多数基础知识的良好开端,以及在C#中很好地处理它的方法。