Multithreading 正在Windows Phone 7上等待WebRequest
我正在使用OAuth2在WindowsPhone7中使用谷歌API做一些工作 在调用API之前,我需要更新访问令牌(如果需要) 我遇到的问题是,在继续调用API之前,等待异步请求更新令牌完成 我已经让它与下面的代码一起工作,但我对它不满意。我正在寻找一种更好的替代方法,而不是简单地在while循环中轮询变量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=
/// <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
获取请求。很高兴这对你有用!