【发布时间】:2019-05-07 20:23:39
【问题描述】:
试图将我的程序的一部分转换为异步 http 客户端调用。 取出部分代码(如下)进行测试。 基本上是一个非阻塞的异步按钮(据我所知)SendAsync()。它不应该阻塞 UI 线程,对吗?由于我目前看不到的原因,它仍然会阻止它。
我过去 2 天一直在试图找出问题所在。我实现了非阻塞文件写入日志记录和电子邮件发送功能,它们工作正常。
谁能指出我做错了什么?
private async void button2_Click(object sender, EventArgs e)
{
NetworkCredential differentCredToPass = new NetworkCredential("user", "*****", "domain");
WebProxy wcProxy = new WebProxy("1.1.1.1", 8080);
wcProxy.UseDefaultCredentials = false;
wcProxy.Credentials = differentCredToPass;
var httpHandler = new HttpClientHandler();
httpHandler.UseProxy = true;
httpHandler.UseDefaultCredentials = false;
httpHandler.Proxy = wcProxy;
using(HttpClient httpClient = new HttpClient(httpHandler) )
{
try
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "http://cisco.Com");
HttpResponseMessage response = await httpClient.SendAsync(request);
textBox1.AppendText(response.StatusCode.ToString() + Environment.NewLine);
}
catch (Exception ex)
{
textBox1.AppendText(ex.Message.ToString() + Environment.NewLine);
throw;
}
}
}
【问题讨论】:
-
看起来好像您在 UI 线程 (
button2_Click) 上运行它,并且由于您向 UI 控件 (textBox1) 写入了一些内容,因此它必须阻塞,直到它收到回复。如果您希望它不阻塞 UI,请使用BackgroundWorker或以其他方式从另一个线程池中获取线程,并在回调中更新文本框。 -
我将其移至单独的函数:
public async Task<string> send_Request()并使用string a = await send_Request();从按钮调用它,还删除了所有对文本框的引用,它仍然阻塞。
标签: c# http asynchronous sendasync