我有一个返回自定义 HttpClient 的类,该类在底层获取要使用的令牌,因此用户不必亲自获取令牌。我只是好奇我是否可以在异步方法上调用 .Result ,而在该方法中返回结果时我已经“等待”了该方法
public class CustomClient
{
private static Int32 _refreshRate = 0;
private static Sring _token;
private static DateTime _tokenExpires = DateTime.Now.AddDays(-1);
public static HttpClient Client
{
get { return GetNewClient(); }
}
private static HttpClient GetNewClient()
{
DateTime now = DateTime.Now;
if (now > = _tokenExpires)
{
var tokenTask = GetTokenAndRefreshRate().Result; //Is this OK
_token = tokenTask.Item1;
_refreshRate = tokenTask.Item2;
_tokenExpires = DateTime.Now.AddSeconds(_refreshRate);
}
if (String.IsNullOrEmpty(_token))
{
throw new Exception("Cannot get access token");
}
HttpClientHandler clientHandler = new HttpClientHandler();
clientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => { return true; };
var httpClient = new HttpClient(clientHandler);
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _token);
return httpClient;
}
private static async Task<Tuple<String, Int32>> GetTokenAndRefreshRate()
{
Task<String, Int32> tokenTask = Task.Run(() =>
{
Int32 refreshRate = 0;
String token = TokenManager.CreateAuthorizationToken(out refreshRate);
return new Tuple<String, Int32>(token, refreshRate);
});
var result = await tokenTask;
return new Tuple<String, Int32>(result.Item1, result.Item2);
}
}
我想我可以做到这一点:
var tokenTask = Task.Run(() => GetTokenAndRefreshRate());
tokenTask.Wait();
var result = tokneTask.Result;