带有Sleep的线程不能正常工作
本文关键字:工作 常工作 Sleep 线程 不能 带有 | 更新日期: 2023-09-27 18:02:11
我正在尝试实现一个方法,将HTTP请求发送到服务器并在每两秒钟获得响应。我需要添加一个新的行,以显示响应字符串的富文本框。我用的是《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次。这有什么不对。我正在本地主机上测试应用程序。所以没有任何连接问题,使应用程序变慢。
当你在UI(主)线程上使用Thread.Sleep(2000)
时,那么你的应用程序停止响应任何用户操作-它只是挂起2秒。那是个坏主意。
我建议您使用定时器组件完成此任务。在表单中添加计时器(可以在工具箱中找到),并将其Interval
设置为2000毫秒。然后订阅定时器的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);
}
}