带有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次。这有什么不对。我正在本地主机上测试应用程序。所以没有任何连接问题,使应用程序变慢。

带有Sleep的线程不能正常工作

当你在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);
    }
}