WebClient DownloadString 与 TextChanged 事件 C#
WebClient DownloadString with TextChanged Event C#
我在 C# 程序中遇到问题,该程序使用 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 秒然后程序开始翻译但仍然滞后,没有任何运气。
有没有简单的方法可以毫无问题地做到这一点?
您的问题是,您的用户在文本框中键入的每个字符都会导致 WebClient 下载必须完成,然后才能接受下一次按键。我建议您执行以下操作...
创建一个计时器,每次用户输入一个字符时启动或重新启动,并在到期时禁用文本框并在重新启用文本框之前运行搜索。您也最好使用异步 WebClient 调用。
尝试使用异步。
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;
}
}
}
我在 C# 程序中遇到问题,该程序使用 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 秒然后程序开始翻译但仍然滞后,没有任何运气。
有没有简单的方法可以毫无问题地做到这一点?
您的问题是,您的用户在文本框中键入的每个字符都会导致 WebClient 下载必须完成,然后才能接受下一次按键。我建议您执行以下操作...
创建一个计时器,每次用户输入一个字符时启动或重新启动,并在到期时禁用文本框并在重新启用文本框之前运行搜索。您也最好使用异步 WebClient 调用。
尝试使用异步。
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;
}
}
}