线程与睡眠无法正常工作

时间:2014-05-07 09:13:05

标签: c# multithreading http

我正在尝试实现一种方法,该方法将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中测试应用程序。所以没有任何连接问题导致应用程序变慢。

1 个答案:

答案 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);
    }
}