gpt4 book ai didi

C# HttpClient - PostAsync 不返回(即使使用 ConfigureAwait)

转载 作者:太空宇宙 更新时间:2023-11-03 19:44:58 26 4
gpt4 key购买 nike

我对在 C# 中使用 HttpClient 感到疯狂...

我简化了我的项目,以便更容易地复制我的问题。我想要做的就是在后台调用 HttpClient.PostAsync 而不阻塞我的 UI 窗口(顺便说一句,我正在使用 WPF)。

这是我的代码(将代码精简到最小值):Bing 仅在此处用于不显示我的私有(private) Web 服务,当然它可以替换为所有其他网站。

    private async void Window_Loaded(object sender, RoutedEventArgs e)
{
try {
MyTextBlock.Text = "Waiting...";

Uri webUri = new Uri("https://www.bing.com/");
using (HttpClient client = new HttpClient()) {
using (HttpResponseMessage response = await client.PostAsync(webUri, new MultipartFormDataContent())) {
MyTextBlock.Text = await response.Content.ReadAsStringAsync();
}
}
} catch (Exception exc) {
MessageBox.Show(exc.ToString(), "Unhandled Exception");
}
}

当我的 UI 正在等待异步发布请求时,它在文本框中显示“正在等待”。当异步请求返回时,它会显示结果。不会再发生任何事情。

所以这里出现了问题,有时 PostAsync 方法根本不返回......甚至忽略了超时。当我调试时,它总是有效,但当我尝试启动应用程序时,它有时会挂起。并非总是这样,这不会使查找错误变得更容易。我尝试了很多调用异步请求的方法,但每次都是同样的问题。

我还阅读了以下博客,了解异步方法中的阻塞问题,但即使使用 ConfigureAwait 也没有区别。 http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

我只是可以想象 HttpClient 异步方法锁定主线程中存在问题,所以它导致了这个问题。 Wenn 我在 ConsoleApplication 中使用相同的代码,一切都很好。我的客户端和目的地之间有一个代理,但这根本不是问题。

有人可以复制这个问题吗?我在 .NET Framework 4.6.1 中使用 C#/WPF。

最佳答案

你不需要await client.PostAsync(webUri, i_formData) 因为在调用返回后你不需要对结果做任何事情,你可以返回 Task。改成这个;

public static Task<HttpResponseMessage> BasicRequest(MultipartFormDataContent i_formData)
{
Uri webUri = new Uri("https://www.bing.com");

HttpClient client = new HttpClient {
Timeout = TimeSpan.FromSeconds(1)
};
return client.PostAsync(webUri, i_formData);
}

您的Window_Load 是一个事件处理程序。您可以将其设为 async void,这是您唯一不必返回 Task 的情况。通过使其成为 async,您可以删除所有过于复杂的代码:

private async void Window_Loaded(object sender, RoutedEventArgs e)
{
MyTextBlock.Text = "Waiting";
HttpResponseMessage response = await BasicRequest(new
MultipartFormDataContent());
string test = await response.Content.ReadAsStringAsync();
this.Close();
}

关于C# HttpClient - PostAsync 不返回(即使使用 ConfigureAwait),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47011139/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com