WebClient DownloadString与TextChanged事件C#
我在C#程序中遇到问题,该程序使用php脚本翻译单词并将结果字符串下载到WebClient DownloadString与TextChanged事件C#,c#,.net,winforms,webclient,downloadstring,C#,.net,Winforms,Webclient,Downloadstring,我在C#程序中遇到问题,该程序使用php脚本翻译单词并将结果字符串下载到TextBox 我的程序有两个文本框 txtWord,txtTranslatedWord 这就是简化的代码 WebClient c = new WebClient(); private void txtWord_TextChanged(object sender, EventArgs e) { string response = c.DownloadString("http://example.com/Service
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下载,必须在下一次按键之前完成下载。我建议你做以下事情 创建一个计时器,该计时器在用户每次输入字符时启动或重新启动,并在过期时禁用文本框并在重新启用文本框之前运行搜索。您还可以使用异步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;
}
}
}
尝试使用异步
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;
}
}
}
我很困惑,你想把“php”代码转换成“c”?很抱歉耽搁了回答是的是WinForms吗?是的WinForms我很困惑,你想把“php”代码转换成“c”#吗?很抱歉延迟了答案是:是的是WinForms吗?是的,WinForms我已经做到了,除了async,但我想用任何方法来停止像BackgroundWorker一样的滞后,但我遇到了一个例外,我的意思是我不想让用户感觉到程序中发生了什么,比如下载或任何…所以如果你有一个解决方案代码你可以发布一个例子吗?我已经做了,除了异步,但我想用任何方法来停止像BackgroundWorker一样的滞后,但我做了一个例外,我的意思是我不想让用户感觉到程序中发生了什么,比如下载或任何…所以如果你有一个解决方案代码,你可以发布一个例子吗?这解决了一半的问题问题-gui响应性问题。它没有解释的是,你不想在用户输入的每个字符之后打网络电话——你想预测他们何时完成输入。这个解决方案实际上可以返回不确定的结果——对部分单词的调用可以在对整个单词的调用之后完成。我已经知道了,这就是我说的原因(简化代码)我只想用任何方法快速获取数据而不延迟,但感谢您的想法^^这解决了一半的问题-gui响应问题。它没有解释的是,你不想在用户输入的每个字符之后打网络电话——你想预测他们何时完成输入。这个解决方案实际上可以返回不确定的结果——调用一个部分单词可能会在整个单词的一个之后完成。我已经知道了这一点,这就是为什么我说(简化代码)我只想以任何方式快速获取数据而不延迟,但感谢您的想法^^