首页 > 解决方案 > 状态 = WaitingForActivation 使用异步方法

问题描述

我正在尝试使用以下代码调用 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方法的情况下得到结果,但我找不到任何有asyn方法的解决方案。

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

提前致谢

标签: c#restapioauth-2.0async-await

解决方案


你需要这样awaitCallApi方法:

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(); 
    ...
}

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

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


推荐阅读