WebClient DownloadString与TextChanged事件C#

时间:2017-05-29 23:42:18

标签: c# .net winforms webclient downloadstring

我在 C#程序中遇到问题,该程序使用 php 脚本翻译单词并将结果字符串下载到TextBox

我的程序有两个TextBoxes

txtWordtxtTranslatedWord

这就是简化代码

WebClient c = new WebClient();
private void txtWord_TextChanged(object sender, EventArgs e)
{
    string response = c.DownloadString("http://example.com/Services/Translator/lang/EnglishToArabic.php?Word=" + txtWord.Text);
    switch (response.ToLower())
    {
        case "not exist":
            {
                txtTranslatedWord.Text = "{Sorry but no translation for this word!}";
                break;
            }
        default:
            {
                txtTranslatedWord.Text = response;
                break;
            }
    }
}

问题是当文本被更改时程序滞后并且看起来会停止工作

该计划成功运作,但经过这么多滞后, 特别是如果作家写得这么快。

我尝试BackgroundWorker并延迟使用,例如当用户停止写入2秒钟然后程序开始翻译但仍然滞后而没有任何运气。

有没有简单的方法可以毫无问题地执行此操作?

2 个答案:

答案 0 :(得分:2)

尝试使用异步。

WebClient不支持并发I / O操作,因此将使用HttpClient

HttpClient client = new HttpClient();

private async void txtWord_TextChanged(object sender, EventArgs e)
{
    var response = await client.GetStringAsync(
        "http://example.com/Services/Translator/lang/EnglishToArabic.php?Word=" + txtWord.Text);
    switch (response.ToLower())
    {
        case "not exist":
            {
                txtTranslatedWord.Text = "{Sorry but no translation for this word!}";
                break;
            }
        default:
            {
                txtTranslatedWord.Text = response;
                break;
            }
    }
}

答案 1 :(得分:0)

您的问题是,您的用户在文本框中键入的每个字符都会导致WebClient下载必须在接受下一个按键之前完成。我建议你做以下事情......

创建一个计时器,每次用户输入一个字符时启动或重新启动,并在过期时禁用文本框并在重新启用文本框之前运行搜索。您也可以使用异步WebClient调用。