Entwickler-Ecke

WinForms - Steuerelement in Methoden verwenden


mats74 - Fr 07.07.23 10:31
Titel: Steuerelement in Methoden verwenden
Hallo zusammen

Ich möchte ein Steuerelement als Referenz an einer Methode zur Verfügung stellen und direkt auf die Eigenschaften zugreifen.
Ich habe folgenden Code erstellt:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
// Hauptmethode
void Methode_1()
{
    Methode_2(textBox1);
}

// Funktionsmethode in einem anderen Namespace
public static void Methode_2(TextBox textBox)
{
    // Inhalt Steuerelement ändern
    textBox.Text = "Hallo";
}


Dieser Code funktioniert.
Ich habe nun aber das Problem, dass das Programm teilweise ohne Fehlerausgabe geschlossen wird.
Ich habe nachgelesen, dass die Synchronisation des grafischen Steuerelements so nicht gewährleistet ist.
Die Referenzierung sollte wahrscheinlich so aussehen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
// Hauptmethode
void Methode_1()
{
    Methode_2(textBox1);
}

// Funktionsmethode steht in einem anderen Namespace
public static void Methode_2(TextBox textBox)
{
    // Inhalt ändern
    textBox.Invoke((MethodInvoker)delegate
    {
        textBox.Text = "Hallo";
    });
}


Ich habe in diesem Fall leider zu wenig Erfahrung und sollte dies in einer grösseren Codestruktur mit vielen Steuerelementen umsetzen.

Kann mir jemand eine Rückmeldung geben, ob dieser Code so in der Praxis angewendet wird oder eine andere Codestruktur angewendet werden sollte?

Moderiert von user profile iconTh69: Titel geändert ("vererben" -> "verwenden").


Th69 - Fr 07.07.23 14:17

Invoke ist nötig, wenn man aus einem anderen Thread als dem UI-Thread, auf UI-Elemente zugreifen möchte (insbes. schreibend), s.a. myCSharp.de: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) [https://mycsharp.de/forum/threads/33113/faq-controls-von-thread-aktualisieren-lassen-control-invoke-dispatcher-invoke].


Ralf Jansen - Fr 07.07.23 14:59

Zitat:
Ich habe nun aber das Problem, dass das Programm teilweise ohne Fehlerausgabe geschlossen wird.


Das klingt dann nebenbei nach fehlendem Exception Handling/Logging und du bei jedem Problem nicht weißt warum es passiert ist da du kein Feedback/logging hast was passiert ist.
Das hier ist dann ein spezielles Problem das vermutlich auf Multi Threading zurückzuführen ist oder sein könnte.

Aber du solltest aus raten Wissen machen in dem du ein Exception Handling/Logging einbaust.


mats74 - Fr 07.07.23 15:02

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Invoke ist nötig, wenn man aus einem anderen Thread als dem UI-Thread, auf UI-Elemente zugreifen möchte (insbes. schreibend), s.a. myCSharp.de: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke) [https://mycsharp.de/forum/threads/33113/faq-controls-von-thread-aktualisieren-lassen-control-invoke-dispatcher-invoke].


Vielen Dank für deinen Hinweis.
Der Link ist sehr nützlich und beschreibt meine Problemstellung sehr treffend.
Ich werde daraus das weitere Vorgehen ableiten können.


mats74 - Fr 07.07.23 15:13

Zitat:
... Aber du solltest aus raten Wissen machen in dem du ein Exception Handling/Logging einbaust...


Ich habe schon einige Ausgaben in Logfiles aus den entsprechenden Exceptions gesetzt.
Leider habe ich noch keine schlüssigen Fehlermeldungen erhalten, die mir die Lösung des Problems ermöglichen.
Es besteht auch keinen eindeutigen Triggerpunkt für die Exception, da der Programmabbruch willkürlich aus unterschiedlichen Aktionen ausgelöst wird und nicht rekonstruierbar ist.


Ralf Jansen - Fr 07.07.23 15:49

Ein globaler Exception Handler könnte helfen: AppDomain.UnhandledException [https://learn.microsoft.com/de-de/dotnet/api/system.appdomain.unhandledexception?view=net-7.0]

Moderiert von user profile iconTh69: URL-Titel hinzugefügt.


mats74 - Mo 07.08.23 08:41

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Ein globaler Exception Handler könnte helfen: AppDomain.UnhandledException [https://learn.microsoft.com/de-de/dotnet/api/system.appdomain.unhandledexception?view=net-7.0]


Der globale Exception Handler hat uns weitere Information zu den Programmunterbrüchen geliefert.
Es bestehen noch einige Netzwerkkonfigurationen, welche die Zugriffzeiten auf den SQL-Server beeinflussen können.
Ich weiss nun, das einzelne Laufwerke in gewissen Konstellationen nicht erreichbar sind und erst nach entsprechenden Ausführungen wieder verbunden werden.

Ich schreibe nun die Methodenaufrufe um, damit keine Controls in den Parametern oder Parameterlisten existieren.
Einzelne Methoden haben zu lange Zugriffzeiten auf die Speichergrundlage oder sind grundsätzlich zu gross.
Dadurch können auch grafische Fehler erzeugt werden.
Dies ist sicherlich auch ein Grund, warum das Programm automatisch geschlossen wird.

Vielen Dank für eure Unterstützung.