有人知道为什么HttpClient-PostAsync不返回。它什么也没做。我偶尔有它工作,特别是对于那些过时的人,但有时似乎什么也没做,特别是在负载下,它不会抛出异常,这当然会使我的代码不可靠且难以调试。
我尝试添加ConfigureAwait(false)没什么区别。
我怀疑任务无法“打包”
这是使用Visual Studio代码在macOS Catalina上运行的核心3.0控制台应用程序中
这段代码几乎是从Microsoft文档复制而来的,发布时我叫Microsoft Graph。
public static async Task PostAsync(HttpClient httpClient, string url, string token, HttpContent content, Action<JObject> processResult, ILogger log)
{
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
// content.Headers.Clear();
content.Headers.Add("Content-Type", "application/json");
try
{
HttpResponseMessage response = await httpClient.PostAsync(url, content);
if (response.IsSuccessStatusCode)
{
var json = await response.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject(json) as JObject;
processResult(result);
}
else
{
var errorContent = await response.Content.ReadAsStringAsync();
log.LogError(errorContent);
}
}
catch (System.Exception ex)
{
log.LogError(ex, ex.Message);
throw;
}
}
这是调用代码的示例
public async Task SendInvitation(string token, Invitation invitation, ILogger logger)
{
var stringContent = new StringContent(JsonConvert.SerializeObject(invitation), Encoding.UTF8, "application/json");
await HttpHelpers.PostAsync(
Client,
"https://graph.microsoft.com/v1.0/invitations",
token,
stringContent,
result => logger.LogInformation(DebugHelpers.Print(result)),
logger);
}
已回答(排序)
如果我改变
HttpResponseMessage response = await httpClient.PostAsync(url, content);
到
HttpResponseMessage response = httpClient.PostAsync(url, content).GetAwaiter().GetResult();
它似乎可以工作,但是速度很慢,因为我正在使用阻塞代码。我认为这是macOS上核心3的一个怪癖。我不喜欢这种情况。
更多信息
我正在做很多循环。
似乎,如果将所有我正在等待的东西都放在taskList中,它将表现正常。
\\ Pseudo Code
var taskList = new List<Task>();
foreach(var thing in things){
taskList.Add(HttpHelpers.PostAsync(...things));
}
await Task.WhenAll(taskList);
答案 0 :(得分:2)
请检查您在代码执行路径中进行的所有调用是否都支持异步。例如,一旦我花了很多时间弄清楚一个名为CommandLineParser的nuget包不支持异步调用。我像这样使用它:
public static void Main(string[] args)
{
Parser.Default.ParseArguments<Options>(args)
.WithParsed(async options =>
{ await httphelper.PostAsync(...);
}
}
我通过将其更改为
来解决了该问题public static void Main(string[] args)
{
Parser.Default.ParseArguments<Options>(args)
.WithParsed(options =>
{ httphelper.PostAsync(...).Result;
}
}
因此,请检查您是否正在使用某些不支持异步的呼叫。
答案 1 :(得分:-1)
像这样尝试ConfigureAwait
HttpResponseMessage response = await httpClient.PostAsync(url, content).ConfigureAwait(false);