在已等待结果的异步方法上调用.Result

问题描述 投票:0回答:1

我有一个返回自定义 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);
   }

}
c# asynchronous task
1个回答
0
投票

我想我可以做到这一点:

var tokenTask = Task.Run(() => GetTokenAndRefreshRate());
tokenTask.Wait();

var result = tokneTask.Result;
© www.soinside.com 2019 - 2024. All rights reserved.