异步方法运行正常,但不会改变任何东西

时间:2016-01-15 09:03:08

标签: c# asynchronous windows-phone-8.1

我想通过以下方法从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上使用此列表并且列表保持空白。

有人可以解释一下为什么甚至有解决方法吗?

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#中很好地处理它的方法。