Autor Beitrag
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Fr 07.07.23 10:31 
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:

ausblenden 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:

ausblenden 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").

_________________
Gruss
mats74
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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).

Für diesen Beitrag haben gedankt: mats74
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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).


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.

_________________
Gruss
mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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.

_________________
Gruss
mats74
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4701
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 07.07.23 15:49 
Ein globaler Exception Handler könnte helfen: AppDomain.UnhandledException

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

Für diesen Beitrag haben gedankt: mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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


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.

_________________
Gruss
mats74

Für diesen Beitrag haben gedankt: Th69