Как получить данные из веб-интерфейса, проанализировать их и отобразить на Windows Phone 7 - PullRequest
1 голос
/ 30 декабря 2010

В этот день я опубликовал сообщение о получении данных из веб-интерфейса на Windows Phone 7, но мне кажется, что я слишком усложнил ситуацию и был слишком неясен относительно того, что я хотел сделать.

Теперь я пытаюсь сделать так, чтобы метод выходил и извлекал некоторые данные в формате xml из webapi и возвращал их, проанализированные классу.

Например:

    public List<Alliance> getAllianceList()
    {
        const string serviceUrl = "/eve/AllianceList.xml.aspx";

        string xml = getXML(serviceUrl);

        //Some parsing logic and then returns it.
    }

В getXML я пытаюсь получить данные, используя WebClient или HttpWebRequest (не знает, какой из них лучший), а затем возвращает его. Но проблема в моем сценарии заключается в том, что он асинхронный, и у меня мало знаний об асинхронности.

Вот как я сделал это до сих пор:

    private string _xml = "";
    public string getXML(string serviceUrl)
    {
        var webClient = new WebClient();
        webClient.DownloadStringCompleted += webClient_DownloadStringCompleted;
        webClient.DownloadStringAsync(new Uri(ApiUrl + serviceUrl));
    }

    void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            _xml = e.Result;
        }
    }

Теперь я не понимаю, как продолжить синтаксический анализ в getAllianceList, если запрос асинхронный. Должен ли я сделать всю "цепочку" из и включая асинхронную функцию getAllianceList? И если да, то как?

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

Во-первых, я бы порекомендовал HttpWebRequest, чтобы избежать блокировки потока пользовательского интерфейса. Подробнее об этом рассказано в моем посте здесь.

WebClient, HttpWebRequest и поток пользовательского интерфейса на Windows Phone 7

Затем вы можете передать поток, полученный в обратном вызове, в XDocument.Load (), чтобы проанализировать XML и работать с ним.

В моем посте ниже приведен базовый пример синтаксического анализа этого XML и привязки данных, который начинается с XDocument.Load () (в данном случае с использованием файла XAP, но принцип тот же).

привязка источника данных Linq к списку

0 голосов
/ 31 декабря 2010

Это правильный способ сделать это?

    private const string apiUrl = "http://api.eveonline.com";
    public void UpdateAllianceList()
    {
        const string serviceUrl = "/eve/AllianceList.xml.aspx";

        var wc = new WebClient();
        wc.DownloadStringCompleted += (s, args) =>
                                          {
                                              var worker = new Thread(ParseXmlThread);;
                                              worker.Start(args.Result);
                                          };

        wc.DownloadStringAsync(new Uri(apiUrl + serviceUrl));
    }

    private void ParseXmlThread(object xml)
    {       
        // PARSING & ADDING TO THE VIEWMODEL.
    }
...