我正在尝试实现一种方法,该方法将HTTP请求发送到服务器并在每两秒钟内获取响应。我需要在显示响应字符串的富文本框中添加一个新行。我用了#34; Thread.Sleep(2000)"暂停while循环的方法。
这是我的代码
private void buttonRequest_Click(object sender, EventArgs e)
{
while (true)
{
using (var client = new WebClient())
{
var response = client.DownloadString("http://localhost:8181/");
var responseString = response;
richTextResponse.Text += responseString + Environment.NewLine;
}
Thread.Sleep(2000);
}
}
但这不能正常运作。它在开始时暂停它并突然打印相同的字符串超过5次。这有什么不对。我在localhost中测试应用程序。所以没有任何连接问题导致应用程序变慢。
答案 0 :(得分:4)
当您在UI(主)线程上使用Thread.Sleep(2000)
时,您的应用程序会停止响应任何用户操作 - 它只会挂起2秒钟。这是一个坏主意。
我建议你使用Timer组件来完成这项任务。向表单添加计时器(您可以在工具箱中找到它)并将其Interval
设置为2000毫秒。然后订阅timer' Tick
事件,并在此事件处理程序中执行HTTP请求。我建议使用异步处理程序以避免在等待响应时挂起:
private async void timer_Tick(object sender, EventArgs e)
{
using (var client = new WebClient())
{
Uri uri = new Uri("http://localhost:8181/");
var response = await client.DownloadStringTaskAsync(uri);
richTextResponse.Text += response + Environment.NewLine;
}
}
单击按钮时启动计时器:
private void buttonRequest_Click(object sender, EventArgs e)
{
timer.Start();
}
另一种选择是使你的方法异步并使用Task.Delay
而不是让线程休眠(但我可能会使用更容易理解和控制的计时器):
private async void buttonRequest_Click(object sender, EventArgs e)
{
while (true)
{
using (var client = new WebClient())
{
Uri uri = new Uri("http://localhost:8181/");
var response = await client.DownloadStringTaskAsync(uri);
richTextResponse.Text += response + Environment.NewLine;
}
await Task.Delay(2000);
}
}