C# 睡眠线程不能正常工作

C# 睡眠线程不能正常工作,c#,multithreading,http,C#,Multithreading,Http,我正在尝试实现一种方法,将HTTP请求发送到服务器,并在每两秒钟内获得响应。我需要在显示响应字符串的富文本框中添加一行。我使用“Thread.Sleep(2000)”方法暂停while循环 这是我的密码 private void buttonRequest_Click(object sender, EventArgs e) { while (true) { using (var client = new WebClient()) {

我正在尝试实现一种方法,将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秒钟。那是个坏主意

我建议您使用该组件完成此任务。将计时器添加到表单中(可以在工具箱中找到),并将其设置为2000毫秒。然后订阅计时器的事件,并在此事件处理程序中执行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();
}

另一个选项是使您的方法异步,并使用,而不是使线程休眠(但我可能会使用计时器,它更易于理解和控制):


当您在UI(主)线程上使用
Thread.Sleep(2000)
时,您的应用程序将停止响应任何用户操作-它只会挂起2秒钟。那是个坏主意

我建议您使用该组件完成此任务。将计时器添加到表单中(可以在工具箱中找到),并将其设置为2000毫秒。然后订阅计时器的事件,并在此事件处理程序中执行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();
}

另一个选项是使您的方法异步,并使用,而不是使线程休眠(但我可能会使用计时器,它更易于理解和控制):


在UI线程上睡眠是一个糟糕的主意。您应该在这里使用计时器,当您睡眠UI线程时,所有UI更新都将排队等待,直到线程再次可用(因此,您可以一次看到5个更新)。谢谢您的建议。。但是为什么睡眠UI线程不好,你能给我解释一下吗。@Sandaru我刚刚做了…@Sandaru是Winforms应用程序吗?睡眠UI线程是一个不好的主意你应该在这里使用一个计时器,当你睡眠UI线程时,所有UI更新都会排队,直到线程再次可用为止(因此你一次看到5个更新)谢谢你的建议。。但为什么睡眠UI线程不好,你能给我解释一下吗。@Sandaru我刚刚做了…@Sandaru是Winforms应用程序吗?