Multithreading 正在Windows Phone 7上等待WebRequest

Multithreading 正在Windows Phone 7上等待WebRequest,multithreading,windows-phone-7,httpwebrequest,Multithreading,Windows Phone 7,Httpwebrequest,我正在使用OAuth2在WindowsPhone7中使用谷歌API做一些工作 在调用API之前,我需要更新访问令牌(如果需要) 我遇到的问题是,在继续调用API之前,等待异步请求更新令牌完成 我已经让它与下面的代码一起工作,但我对它不满意。我正在寻找一种更好的替代方法,而不是简单地在while循环中轮询变量 /// <summary> /// Calls the API. /// </summary> /// <param name=

我正在使用OAuth2在WindowsPhone7中使用谷歌API做一些工作

在调用API之前,我需要更新访问令牌(如果需要)

我遇到的问题是,在继续调用API之前,等待异步请求更新令牌完成

我已经让它与下面的代码一起工作,但我对它不满意。我正在寻找一种更好的替代方法,而不是简单地在while循环中轮询变量

    /// <summary>
    /// Calls the API.
    /// </summary>
    /// <param name="callback">The callback.</param>
    /// <param name="api">The API.</param>
    /// <param name="queryStrings">The query strings.</param>
    public static void CallApi(AsyncCallback callback, string api, Dictionary<string, string> queryStrings = null)
    {
        var uri = new Uri(string.Format("{0}{1}{2}", ApiBaseUrl, api, queryStrings.ToQueryString()));

        if (accessTokenExpires < DateTime.Now.AddSeconds(300))
        {
            RefreshAccessToken();
        }

        // Start new thread so we don't lock up the UI thread while waiting
        var thread = new Thread(
            () =>
                {
                    // Wait for the access token to be updated
                    while (accessTokenExpires < DateTime.Now.AddSeconds(300)) ;

                    var request = WebRequest.CreateHttp(uri);
                    request.Headers["Authorization"] = string.Format("OAuth {0}", accessToken);
                    request.BeginGetResponse(callback, request);
                });

        thread.Start();
    }

    /// <summary>
    /// Refresh the access token.
    /// </summary>
    private static void RefreshAccessToken()
    {
        if (Config.GoogleOAuthRefreshToken == string.Empty)
        {
            // TODO - Present the OAuth popup to the user
            return;
        }

        var uri = new Uri(GetTokenUrl);

        var request = WebRequest.CreateHttp(uri);
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";

        request.BeginGetRequestStream(RefreshToken_GetRequest, request);
    }
//
///调用API。
/// 
///回调。
///API。
///查询字符串。
公共静态void CallApi(异步回调、字符串api、字典queryStrings=null)
{
var uri=new uri(string.Format(“{0}{1}{2}”),ApiBaseUrl,api,querystring.ToQueryString());
if(accessTokenExpires
{
//等待更新访问令牌
while(accessTokenExpires
您是否考虑过使用or VS 2012将此逻辑转换为Task.Delay调用?它甚至可能对您的web请求代码有所帮助。

我认为您已经开始了解您需要的内容,但只需要充分利用WebRequest的异步特性。下面是一个如何做到这一点的示例

public static void CallApi(AsyncCallback callback, string api, Dictionary<string, string> queryStrings = null)
{
    var uri = new Uri(string.Format("{0}{1}{2}", ApiBaseUrl, api, queryStrings.ToQueryString()));

    RefreshAccessToken(() =>
        {
            var request = WebRequest.CreateHttp(uri);
            request.Headers["Authorization"] = string.Format("OAuth {0}", accessToken);
            request.BeginGetResponse(callback, request);
        });
}

private static void RefreshAccessToken(Action callback)
{
    if(IsTokenExpired() == false)
    {
        if(callback != null) callback();
        return;
    }
    if (Config.GoogleOAuthRefreshToken == string.Empty)
    {
        // TODO - Present the OAuth popup to the user
        return;
    }

    var uri = new Uri(GetTokenUrl);

    var request = WebRequest.CreateHttp(uri);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";

    request.BeginGetRequestStream(asyncResult =>
    {
        // Do anything for POST
        request.BeginGetResponse(asyncResult2 =>
        {
            // Read stream, and process
            if(callback != null) callback();
        }, null);
    }, request);
}

private bool IsTokenExpired()
{
    return accessTokenExpires < DateTime.Now.AddSeconds(300);
}
publicstaticvoidcallapi(异步回调、字符串api、字典queryStrings=null)
{
var uri=new uri(string.Format(“{0}{1}{2}”),ApiBaseUrl,api,querystring.ToQueryString());
RefreshAccessToken(()=>
{
var-request=WebRequest.CreateHttp(uri);
request.Headers[“Authorization”]=string.Format(“OAuth{0}”,accessToken);
开始响应(回调,请求);
});
}
私有静态void RefreshAccessToken(操作回调)
{
如果(IsTokenExpired()==false)
{
如果(callback!=null)callback();
返回;
}
if(Config.GoogleOAuthRefreshToken==string.Empty)
{
//TODO-向用户显示OAuth弹出窗口
返回;
}
var uri=新uri(GetTokenUrl);
var-request=WebRequest.CreateHttp(uri);
request.Method=“POST”;
request.ContentType=“application/x-www-form-urlencoded”;
request.BeginGetRequestStream(asyncResult=>
{
//为邮政做任何事
request.BeginGetResponse(asyncResult2=>
{
//读取流,并进行处理
如果(callback!=null)callback();
},空);
},请求);
}
私人文件
{
return accessTokenExpires
在VS 2012中还不支持Windows Phone 7。:)这很痛苦,但我现在使用VS 2010中的异步CTP进行WP7,并在2012年进行W8开发。谢谢。我曾考虑过为api调用创建一个操作并将其传递到RefreshAccessToken,但我找不到通过请求和响应保持句柄的方法。您的响应几乎是完美的,只是您仍然需要将请求传递到BeginGetResponse中,而不是传递null(我只是在没有它的情况下返回一个空响应)。在本例中,如果您使用
请求
变量/对象,则传递null将起作用。不要尝试从
asyncResult2
获取请求。很高兴这对你有用!