C#中如何让Http Post异步函数将响应返回至主程序?
解决C#异步PostData返回响应内容的问题
核心修改要点
- 将
PostData方法返回类型改为Task<string>,并在方法内返回响应body - 主程序使用
await而非Wait()调用异步方法,正确获取返回值
修改后的完整代码
主程序代码(支持异步入口)
// .NET Core/.NET 5+ 允许将主方法标记为async static async Task Main(string[] args) { CallingClass cls = new CallingClass(); // 通过await直接获取异步方法的返回结果 string responseBody = await cls.PostData(accesstoken, thejsondata); // 此处即可使用获取到的响应内容 Console.WriteLine(responseBody); }
CallingClass修改后的代码
public class CallingClass { private static readonly HttpClient client = new HttpClient(); // 修改返回类型为Task<string> public async Task<string> PostData(string accesstoken, string thejsondata) { var request = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri("https://whateverurl.com/"), Headers = { { "Authorization", accesstoken } }, Content = new StringContent(thejsondata) { Headers = { ContentType = new MediaTypeHeaderValue("application/json") } } }; using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); int responseStatusCode = (int)response.StatusCode; // 直接用数值对比替代字符串转换,更高效 if (responseStatusCode == 200 || responseStatusCode == 201) { hlp.AddToOutputFolder($"StatusCode - {responseStatusCode}"); hlp.AddToOutputFolder($"Response - {body}"); } else { hlp.AddToOutputFolder($"ERROR RESPONSE STRING= {responseStatusCode}"); } // 返回响应主体内容 return body; } } }
关键说明
- 之前使用
Wait()仅会阻塞等待任务完成,但无法获取返回值;若必须同步调用(不推荐),可使用PostData(...).Result,但该写法在UI线程、传统ASP.NET环境中易引发死锁,因此优先使用await。 - 若项目基于旧版.NET Framework,无法使用
async Task Main,可将业务逻辑封装到独立的async方法中,再同步调用,但需注意避免阻塞主线程。
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

