Асинхронные вызовы в WP7

Сегодня я экспериментировал с приложениями WP7 и наткнулся на стену. Мне нравится разделять пользовательский интерфейс и основной код приложения, но я наткнулся на стену.

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

(это библиотека xbox360Voice, которую я могу загрузить на моем веб-сайте: http://www.jamesstuddart.co.uk/Projects/ASP.Net/Xbox_Feeds/ , который я переношу на WP7 в качестве теста)

вот фрагмент кода серверной части:

    internal const string BaseUrlFormat = "http://www.360voice.com/api/gamertag-profile.asp?tag={0}";
    internal static string ResponseXml { get; set; }
    internal static WebClient Client = new WebClient();

    public static XboxGamer? GetGamer(string gamerTag)
    {
        var url = string.Format(BaseUrlFormat, gamerTag);

        var response = GetResponse(url, null, null);

        return SerializeResponse(response);
    }

    internal static XboxGamer? SerializeResponse(string response)
    {
        if (string.IsNullOrEmpty(response))
        {
            return null;
        }

        var tempGamer = new XboxGamer();
        var gamer = (XboxGamer)SerializationMethods.Deserialize(tempGamer, response);

        return gamer;
    }

    internal static string GetResponse(string url, string userName, string password)
    {


            if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password))
            {
                Client.Credentials = new NetworkCredential(userName, password);
            }

            try
            {
                Client.DownloadStringCompleted += ClientDownloadStringCompleted;
                Client.DownloadStringAsync(new Uri(url));

                return ResponseXml;
            }
            catch (Exception ex)
            {
                return null;
            }
        }



    internal static void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            ResponseXml = e.Result;
        }
    }

, а это код внешнего интерфейса:

public void GetGamerDetails()
{
    var xboxManager = XboxFactory.GetXboxManager("DarkV1p3r");
    var xboxGamer = xboxManager.GetGamer();

    if (xboxGamer.HasValue)
    {
        var profile = xboxGamer.Value.Profile[0];
        imgAvatar.Source = new BitmapImage(new Uri(profile.ProfilePictureMiniUrl));
        txtUserName.Text = profile.GamerTag;
        txtGamerScore.Text = int.Parse(profile.GamerScore).ToString("G 0,000");
        txtZone.Text = profile.PlayerZone;
    }
    else
    {
        txtUserName.Text = "Failed to load data";
    }
}

Теперь я понимаю, что мне нужно что-то поместить в ClientDownloadStringCompleted но я не знаю, что именно.

6
задан bkaid 28 November 2011 в 22:03
поделиться