【问题标题】:Status = WaitingForActivation using Async method状态 = WaitingForActivation 使用异步方法
【发布时间】:2019-12-28 10:28:47
【问题描述】:

我正在尝试使用以下代码调用 API。

static async Task<string> GetData(string url, string token)    
{
    string result = null;
    ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
    using (var client = new HttpClient())
    {
        if (!string.IsNullOrWhiteSpace(token))
        {

            client.DefaultRequestHeaders.Clear();
            client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
        }
        try
        {
            HttpResponseMessage response = await client.GetAsync(url);
            if (response.IsSuccessStatusCode)
            {
                result = await response.Content.ReadAsStringAsync();

            }
        }
        catch (Exception ex)
        {
            return null;
        }
        return result;

    }
}

这样调用方法

var getData = GetData("<api-url>", token.access_token);

我收到Status = WaitingForActivation

有没有人可以帮助我在这里做错了什么。我试图找到解决方案,我能够在没有 asyn 方法的情况下获得结果,但我找不到使用 asynmethod 的任何解决方案。

任何帮助或建议将不胜感激。

提前致谢

【问题讨论】:

  • 我没完全理解这个问题。是这样称呼的吗? var getData = await GetData("", token.access_token);
  • @phonemyatt 抱歉,我忘记更改调用方法了。是的,它被称为 var getData = await GetData("", token.access_token);但我得到了 Status = WaitingForActivation
  • 这是哪个状态,任务状态?

标签: c# rest api oauth-2.0 async-await


【解决方案1】:

你需要像这样await你的CallApi方法:

var getData = await CallApi("<api-url>", token.access_token);

这意味着你的调用方法也需要像这样async:

public static async Task MyCallingMethod(...)
{
    ...
    var getData = await CallApi("<api-url>", token.access_token);
    ...
}

如果您的调用方法必须是同步的,那么请考虑像这样调用您的 API:

public static void MyCallingMethod(...)
{
    ...
    string getData = null;
    Task.Run(async () =>
    {
        getData = await CallApi("<api-url>", token.access_token).ConfigureAwait(false);
    }).GetAwaiter().GetResult(); 
    ...
}

另外,在using 语句中使用HttpClient 可能非常危险。请查看这篇文章:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

如果您注意到,我在代码示例中使用了ConfigureAwait(false)。您可以在以下文章中了解更多信息:https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

【讨论】:

    猜你喜欢
    • 2018-04-08
    • 1970-01-01
    • 2013-06-28
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多