C#异步HttpClient调用Put方法无输出 无法打印HTTP响应状态码
故障根因
异步方法Put()返回Task对象时,你在同步Main方法中没有等待该任务执行完成,控制台主线程完成发起HTTP请求的操作后就直接执行到Main方法末尾退出进程,根本不会等待接口响应返回,自然不会执行后续打印状态码的逻辑。
你之前在client.Put()后添加的打印"hi"代码可以正常输出,是因为异步方法执行到内部第一个await关键字时,就会立刻将未完成的Task返回给调用方,主线程拿到返回值后不会等待任务后续执行,直接往下运行打印"hi"的同步代码,执行完后直接退出进程,和你观察到的现象完全吻合。
修复方案
标准修复(支持.NET Core 2.1+、.NET 5+ 所有新版本)
将程序入口Main方法改为异步入口,调用Put()时添加await关键字等待任务执行完成即可,修改后可正常拿到响应打印状态码,完整参考代码:
using System; using System.Text; using System.Net.Http; using System.Threading.Tasks; namespace ConsoleApp7 { class Program { // 异步程序入口 static async Task Main(string[] args) { YourClient client = new YourClient(); // 等待PUT请求执行完成 await client.Put(); } public class YourClient { private readonly HttpClient _client; public YourClient() { _client = new HttpClient(); } public async Task Put() { using (var request = new HttpRequestMessage(HttpMethod.Put, "https://api.minecraftservices.com/minecraft/profile/name/egg")) { request.Headers.Add("Authorization", "Bearer token"); request.Content = new StringContent("body", Encoding.UTF8, "application/json"); using (var response = await _client.SendAsync(request)) { var data = await response.Content.ReadAsStringAsync(); var code = response.StatusCode; Console.WriteLine(Convert.ToString(code)); // 自定义响应数据处理逻辑 } } } } } }
旧环境兼容方案(.NET Framework等不支持异步Main的场景)
如果使用的是不支持异步入口的老旧框架版本,可以在调用Put()后调用Wait()方法阻塞主线程,等待异步任务执行完毕再退出进程:
static void Main(string[] args) { YourClient client = new YourClient(); client.Put().Wait(); }
提示:该阻塞写法仅适用于控制台场景,不要在WPF、WinForms等带UI同步上下文的程序中使用,会触发死锁。
内容的提问来源于stack exchange,提问作者Hud Kad
相关产品推荐
相关产品推荐

