0

我在使用php脚本翻译单词并将结果字符串下载.TextBox

我的程序有两个文本框

txtWord,txtTranslatedWord

这就是简化的代码

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 秒然后程序开始翻译但仍然没有任何运气的情况下仍然滞后。

有没有什么简单的方法可以毫无问题地做到这一点?

4

2 回答 2

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;
            }
    }
}
于 2017-05-30T22:04:40.777 回答
0

您的问题是,您的用户在文本框中键入的每个字符都会导致 WebClient 下载,该下载必须在下一次按键被接受之前完成。我建议您执行以下操作...

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

于 2017-05-29T23:50:01.303 回答