gpt4 book ai didi

asynchronous - WP7 中的异步调用

转载 作者:行者123 更新时间:2023-12-04 14:19:36 25 4
gpt4 key购买 nike

我今天一直在试验 WP7 应用程序,但遇到了一些障碍。
我喜欢将 UI 和主应用程序代码分开,但我遇到了麻烦。

我已经成功地实现了一个 webclient 请求并得到了结果,但是由于调用是异步的,我不知道如何将此备份传递到 UI 级别。我似乎无法等待响应完成或任何事情。
我一定做错了什么。

(这是我可以在我的网站上下载的 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 中放置一些东西但我不确定是什么。

最佳答案

您遇到的问题是,一旦将异步操作引入到代码路径中,整个代码路径就需要变为异步。

  • 因为 GetResponse电话DownloadStringAsync它必须成为异步的,它不能返回一个字符串,它只能在回调中这样做
  • 因为 GetGamer电话GetResponse现在是异步的,它不能返回 XboxGamer ,它只能在回调
  • 上做到这一点
  • 因为 GetGamerDetails电话GetGamer现在是异步的,它不能在调用后继续执行它的代码,它只能在收到来自 GetGamer 的回调后才能这样做。 .
  • 因为 GetGamerDetails现在是异步的任何调用它也必须承认这种行为。
  • .... 这一直持续到用户事件将发生的链的顶部。

  • 这是一些空气代码,它使代码具有一些异步性。
    public static void GetGamer(string gamerTag, Action<XboxGamer?> completed) 
    {
    var url = string.Format(BaseUrlFormat, gamerTag);

    var response = GetResponse(url, null, null, (response) =>
    {
    completed(SerializeResponse(response));
    });
    }


    internal static string GetResponse(string url, string userName, string password, Action<string> completed)
    {

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

    try
    {
    client.DownloadStringCompleted += (s, args) =>
    {
    // Messy error handling needed here, out of scope
    completed(args.Result);
    };
    client.DownloadStringAsync(new Uri(url));
    }
    catch
    {
    completed(null);
    }
    }


    public void GetGamerDetails()
    {
    var xboxManager = XboxFactory.GetXboxManager("DarkV1p3r");
    xboxManager.GetGamer( (xboxGamer) =>
    {
    // Need to move to the main UI thread.
    Dispatcher.BeginInvoke(new Action<XboxGamer?>(DisplayGamerDetails), xboxGamer);
    });

    }

    void DisplayGamerDetails(XboxGamer? xboxGamer)
    {
    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";
    }
    }

    如您所见,异步编程会变得非常困惑。

    关于asynchronous - WP7 中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3846186/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com