Async,await和Task仅在调试模式下工作

时间:2018-04-23 16:15:59

标签: c# .net async-await

以下代码以第一行调用' LoadNames'开头。来自.net页面。如果我没有处于调试模式,那么interview变量将设置为null。如果我在那里添加调试点并逐步执行,则从api获取一个值。

在UAT接受采访。我现在指着它现场。

我认为这可能是异步未解决的问题。旧的api速度较慢可能会让它看起来像是在工作,而添加调试会降低它的速度,使其显得正确。

Page.RegisterAsyncTask(new PageAsyncTask(LoadNames));

private async Task LoadNames()
{
   VideoInterviewRepository videoRepository = await Repository.CreateClient();
   IEnumerable<Api> interviews = await Repository.GetEntityList<Api>(EndPoints);

   CODE HERE RUNS BUT FAILS BECAUSE THE ABOVE CODE RETURNS NULL
   var interviewList = interviews.ToDictionary(o => o.id, o => o.name);
}


public static Task<VideoInterviewRepository> CreateClient()
{
    var videoInterviewRepository = new VideoInterviewRepository();
    return videoInterviewRepository.InitializeClient();
}
private async Task<VideoInterviewRepository> InitializeClient()
{
    client = VideoInterviewHttpClient.GetClient(VideoInterviewEndPoints.baseUrl);

    var bearer = await Authenticate.GetBearerTokenAsync(client);

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer);

    return this;
}
public static async Task<string> GetBearerTokenAsync(HttpClient client)
{
   var bearerResult = await client.SendAsync(requestToken);
   var bearerData = await bearerResult.Content.ReadAsStringAsync();

   bearerToken = JObject.Parse(bearerData)["access_token"].ToString();
}

public async Task<IEnumerable<T>> GetEntityList<T>(string path)
{
    IEnumerable<T> model = await GetAndParseApiResponse<IEnumerable<T>>(path);
    return model;
}

private async Task<T> GetAndParseApiResponse<T>(string path)
{
   HttpResponseMessage response = await client.GetAsync(path);
   if (response.IsSuccessStatusCode)
   {
      string content = await response.Content.ReadAsStringAsync();
      model = JsonConvert.DeserializeAnonymousType<T>(content, model);
   }

   return model;
}

1 个答案:

答案 0 :(得分:0)

我发现了这个错误!所有异步和等待以及任务都是正确的。第三方没有足够快地在其末端注册令牌,这就是为什么通过单步执行导致延迟。我应该处理response.IsSuccessStatusCode。