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
Antwort
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;
}
}
- 1. Warum stürzt es beim zweiten Mal ab?
- 2. zweiten Thread nicht erreicht
- 3. Navigationscontroller stürzt beim zweiten Mal ab
- 4. UITableView mit NSFetchedResultsController wird beim zweiten Mal nicht geladen
- 5. Google recaptcha nicht beim zweiten Mal auf der Serverseite
- 6. Firebase Cloud Messaging wird beim zweiten Mal nicht registriert
- 7. Warum funktioniert SIGALRM nicht zum zweiten Mal?
- 8. Scanf wird nicht zum zweiten Mal ausgeführt
- 9. RxAndroid: Retrofit funktioniert nicht zum zweiten Mal?
- 10. Java: Serialisierung funktioniert nicht zum zweiten Mal
- 11. Scanf wird nicht für die Eingabe fragen zum zweiten Mal
- 12. jQuery (window) .load() nicht zum zweiten Mal
- 13. Google Karte nicht rendern zweiten Mal
- 14. Xamarin.form setpage funktioniert nicht zum zweiten Mal
- 15. On Change funktioniert nicht zum zweiten Mal
- 16. "Permission denied" beim Öffnen der Datei zum zweiten Mal schreiben
- 17. Plugin mit Eigen stürzt beim zweiten Mal ab
- 18. android HttpResponse immer stirbt beim zweiten Mal es heißt
- 19. Highcharts (PieChart) - Diagramm Breite reduziert beim Zeichnen zum zweiten Mal
- 20. Probleme mit Android App zum zweiten Mal
- 21. Karte wird nicht zum zweiten Mal geladen. Ich klicke
- 22. Android ListView Onclick Intent Datenverzögerung (Arbeit beim zweiten Mal klicken)
- 23. Warum das Formular nicht beim zweiten Mal geladen wird, besuche ich das Benutzersteuerelement
- 24. Warum funktioniert scanf nicht zum zweiten Mal in meinem Programm?
- 25. MySQL Datenexport ändert sich mal
- 26. CSS-Animation wird nicht zum zweiten Mal angewendet
- 27. onResume() nicht zum zweiten Mal aufgerufen Eine Aktivität wird gestartet
- 28. Multilethreading pausiert den zweiten Thread
- 29. Warum ändert dieses Javascript nicht erfolgreich den Hintergrund beim zweiten Mouseover?
- 30. Zugriff Variablen im Haupt-Thread im zweiten Thread definiert?
Was erwarten Sie sollen jedes Mal, wenn Sie die Taste drücken, ändern? –
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
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