2016-04-08 11 views
0

Ich erstelle eine Anwendung, die Threads verwendet. Alles funktioniert, bis ich zum zweiten Mal auf den Knopf klicke. Beim zweiten Klicken auf die Schaltfläche passiert nichts. Es ist wie das erste Mal, dass alle Sachen geladen werden und dann nur die Werte der Textfelder sperren. Die Sachen in Rot sind nur private Links, die nicht gezeigt werden können. Es ist nicht die Links, weil sie beim ersten Mal gut funktionieren. Sie werden beim zweiten Mal nicht funktionieren. Ich hoffe, dass das, was ich gerade gesagt habe, nicht zu verwirrend war.C# Thread ändert die Textfeldwerte beim zweiten Mal nicht

Image of my code

+0

Was erwarten Sie sollen jedes Mal, wenn Sie die Taste drücken, ändern? –

+0

Ich erwarte, dass die Daten, die aus den Strings gezogen werden, sich ändern. Es funktioniert perfekt, wenn ich den Webrequest und alles nicht in einen Thread lege. Wenn ich keinen Thread für die Webanfrage mache, friert er meine Anwendung ein, bis die Daten abgerufen sind, und ich möchte nicht, dass dies passiert. – VizenDev

+0

Sie haben eine Reihe von Problemen mit Ihrem Code - die meisten von denen Kirill hervorragende Arbeit geleistet hat -, aber ein anderer ist, dass 'WebClient'' IDisposable' implementiert, also müssen Sie '.Dispose()' darauf aufrufen Du bist damit fertig. Du machst 'neuen WebClient() .DownloadString (...)' damit du nicht die Möglichkeit hast es zu entsorgen. Kirills Antwort verwendet das Schlüsselwort using korrekt, um sicherzustellen, dass dies geschieht. – Enigmativity

Antwort

1

name1, name2, name3 sind alle heruntergeladen, wenn das Formular erstellt wird, sind sie nur auf die Textfelder gebunden, wenn Sie die Taste zum ersten Mal drücken.

_name1(), _name2(), _name3() Methoden sind nur Objekte Instanziierungen und haben keine Nebenwirkungen (anders gesagt, sie tun nichts).

Und alles Threading ist nur Flusen - Sie rufen Methoden auf, die nichts tun und dann die Threads abbrechen (wodurch etwas abgebrochen wird, das sowieso nichts tut). Dies hat keinerlei Auswirkung auf die Ausführung, da der Code gerade geschrieben wird, selbst wenn er zum ersten Mal ausgeführt wird.

Die einfache synchrone Lösung für Ihr Code wie folgt aussehen:

private void Button_Click(object sender, EventArgs e) 
{ 
    using (WebClient client = new WebClient()) 
    { 
     textBox1.Text = client.DownloadString("<your URL here>"); 
     textBox2.Text = client.DownloadString("<your URL here>"); 
     textBox3.Text = client.DownloadString("<your URL here>"); 
    } 
} 

sehen, wie Sie Threads verwenden, Ihr Ziel ist es offensichtlich nicht blockierend, asynchrone Ausführung. Der einfachste Weg, es zu erreichen, während die Abfolge von Operationen bewahren ist mit async/await:

private async void Button_Click(object sender, EventArgs e) 
{ 
    // Disabling the button ensures that it's not pressed 
    // again while the first request is still in flight. 
    materialRaisedButton1.Enabled = false; 

    try 
    { 
     using (WebClient client = new WebClient()) 
     { 
      // Execute async downloads in parallel: 
      Task<string>[] parallelDownloads = new[] { 
       client.DownloadStringTaskAsync("<your URL here>"), 
       client.DownloadStringTaskAsync("<your URL here>"), 
       client.DownloadStringTaskAsync("<your URL here>") 
      }; 

      // Collect results. 
      string[] results = await Task.WhenAll(parallelDownloads); 

      // Update all textboxes at the same time. 
      textBox1.Text = results[0]; 
      textBox2.Text = results[1]; 
      textBox3.Text = results[2]; 
     } 
    } 
    finally 
    { 
     materialRaisedButton1.Enabled = true; 
    } 
} 
+0

Wie soll ich es dann machen, ohne es in einen Thread zu stecken? – VizenDev

+0

@VizenDev, siehe bearbeiten –

+0

Das funktioniert, die einzige Sache ist, für jedes der Textfelder hat es eine Verzögerung zwischen dem Sammeln der Daten – VizenDev

Verwandte Themen