【问题标题】:WebClient DownloadString with TextChanged Event C#WebClient DownloadString 与 TextChanged 事件 C#
【发布时间】:2023-04-05 19:25:01
【问题描述】:

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

我的程序有两个文本框

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

有没有什么简单的方法没有问题?

【问题讨论】:

  • 我很困惑,你是不是要把'php'代码转换成'c#'?
  • 对不起,答案是肯定的
  • 是 WinForms 吗?
  • 是的,它的 WinForms

标签: c# .net winforms webclient downloadstring


【解决方案1】:

尝试使用异步。

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;
            }
    }
}

【讨论】:

  • 这解决了一半的问题 - gui 响应问题。它没有考虑的是,您不想在用户输入每个字符后进行网络通话 - 您想预测他们何时完成输入。此解决方案实际上可以返回不确定的结果 - 可能会在对整个单词的调用之后完成对部分单词的调用。
  • 我已经知道了,这就是为什么我说(简化代码)我只想要任何方式快速获取数据而不会延迟,但感谢您的想法^^
【解决方案2】:

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

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

【讨论】:

  • 我已经这样做了,除了异步,但我想要任何方法来停止像 BackgroundWorker 那样的滞后,但是当我这样做时我遇到了一个异常,我的意思是我不希望用户感觉程序中发生了什么下载或任何...所以如果您有解决方案代码,您可以发布示例吗?
猜你喜欢
  • 2020-06-30
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多