2017-05-29 4 views
0

Ich habe ein Problem in C# Programm, das php Skripte Wörter zu übersetzen und das Ergebnis String in TextBox herunterladen.WebClient DownloadString mit Textchanged Ereignis C#

Mein Programm hat zwei Textfelder

txtWord, txtTranslatedWord

und das ist der vereinfachte Code

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

Das Problem seiner, wenn der Text das Programm nacheilenden geändert und sieht aus wie es wäre Gestoppt Arbeiten.

Das Programm arbeitete erfolgreich, aber nach so viel hinken, vor allem, wenn der Schreiber so schnell schreibt.

Ich versuchte BackgroundWorker und eine Verzögerung wie wenn Benutzer aufhören zu schreiben für 2 Sekunden dann Programmstart zu übersetzen, aber immer noch ohne etwas Glück hinken.

Gibt es einen einfachen Weg, dies ohne Probleme zu tun?

+0

Ich bin verwirrt, versuchen Sie, "PHP" -Code in "C#" zu konvertieren? –

+0

Sorry für die Verzögerung die Antwort ist ja –

+0

Ist es WinForms? –

Antwort

2

Versuchen Sie Asynchronität zu verwenden.

WebClient unterstützt keine gleichzeitige E/A-Vorgänge, daher wird HttpClient verwendet.

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

Danke, dass du mir sehr geholfen hast !!! –

+1

Dies löst das halbe Problem - das Problem der gui-Reaktion. Was es nicht berücksichtigt, ist, dass Sie Ihren Webanruf nicht nach jedem Zeichen, das der Benutzer eingibt, machen möchten - Sie möchten vorhersagen, wann sie mit der Eingabe fertig sind. Diese Lösung kann tatsächlich unbestimmte Ergebnisse liefern - es ist möglich, dass ein Teilwort nach dem ersten Wort für das ganze Wort vervollständigt wird. – Glen

+0

Ich weiß das schon und das ist der Grund warum ich gesagt habe (vereinfachter Code) ich wollte nur jeden Weg schnell zu GetData ohne Verzögerung aber danke für deine Ideen ^^ –

0

Ihr Problem ist, dass jedes Zeichen, das Ihr Benutzer in die Textbox eintippt, zu einem WebClient-Download führt, der abgeschlossen sein muss, bevor der nächste Tastendruck akzeptiert werden kann. Ich würde vorschlagen, dass Sie Folgendes tun ...

Erstellen Sie einen Timer, der jedes Mal neu gestartet oder neu gestartet wird, wenn der Benutzer ein Zeichen eingibt und wenn abläuft, deaktiviert das Textfeld und führt die Suche vor dem erneuten Aktivieren des Textfelds. Sie können auch einen asynchronen WebClient-Aufruf verwenden.

+0

Ich habe das schon außer async getan, aber ich möchte jeden Weg stoppen nur wie BackgroundWorker zu verzögern, aber ich habe eine Ausnahme, wenn ich das, ich will nicht, dass Benutzer fühlen, was passiert im Programm wie Download oder andere ... Wenn Sie einen Lösungscode haben, können Sie ein Beispiel veröffentlichen? –

Verwandte Themen