c# - 状态 = 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
方法的解决方案。
任何帮助或建议将不胜感激。
提前致谢
解决方案
你需要这样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();
...
}
此外,在语句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
推荐阅读
- javascript - 一键延迟更改处理程序
- html - 如何使html列表可滚动
- javascript - 如何设置用户第一次打开网站时打开网站的特殊URL?
- python - IAE:预期 'tf.Tensor(False, shape=(), dtype=bool)' 为真。汇总数据:b'最大框坐标值大于1.100000
- json - 在 Reactjs 中渲染嵌套的 JSON 数据
- three.js - A 框灯不影响物体
- hardware - “未能检测到 ESP32 芯片”但实际上找到并工作
- lua - 是否可以将击键用作事件或使用相同的键更改配置文件?
- firebase - Flutter Firestore 离开加入?
- javascript - 将值传递到 Bootboxjs 对话框确认框