Zugriff aus Statischer Klasse - System.InvalidOperationException

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Steppenpferd.

    Zugriff aus Statischer Klasse - System.InvalidOperationException

    Hallo Leute,
    ist es in einer Statischen Klasse per Timer möglich auf Eigenschaften eines Objektes zuzugreifen, das von einem Objekt auf Form1 erbt?

    In der Klasse muss ein Timer Deklariert sein, damit er zurück gesetzt werden kann während er aktiv ist. Auf Form1 befindet sich die TextBox tbLog.
    Diese Exception wird ausgelöst: System.InvalidOperationException: "Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement tbLog erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde."

    Hier der Ausschnitt der Klasse:
    Spoiler anzeigen

    C#-Quellcode

    1. ​static TextBox _logBox;
    2. static System.Timers.Timer timer = new System.Timers.Timer();
    3. static readonly double MillisecondsToClearClipbord = 5000;
    4. public static void SetTextBox(TextBox name) {
    5. _logBox = name; // <<< Hier wird tbLog übergeben
    6. }
    7. static void StartTimedClipboardCleaner() {
    8. if (timer.Enabled) timer.Elapsed -= OnTimedEvent_ClipboardClear;
    9. timer = new System.Timers.Timer(MillisecondsToClearClipbord);
    10. timer.Elapsed += OnTimedEvent_ClipboardClear;
    11. timer.AutoReset = false; // OnTimedEvent nur einmal auslösen
    12. timer.Enabled = true;
    13. }
    14. private static void OnTimedEvent_ClipboardClear(Object source, System.Timers.ElapsedEventArgs e) {
    15. try {
    16. timer.Elapsed -= OnTimedEvent_ClipboardClear;
    17. Thread tcc = new Thread(() => Clipboard.Clear()) { IsBackground = false };
    18. tcc.SetApartmentState(ApartmentState.STA);
    19. tcc.Start();
    20. _logBox.Text += "Clipboard cleared\n"; // <<< Hier wird die Exception ausgelöst.
    21. }
    22. catch (Exception ex) {
    23. System.Diagnostics.Debug.WriteLine(ex.Message);
    24. }
    25. }
    Das Chaos beginnt mit komprimierter Ordnung (Steppenpferd 2019)
    Naja, da der Timer sein Event nebenläufig aufruft und Du somit einen anderen Thread am Wickel hast: nein, das geht nicht. Es liegt nicht an der statischen Klasse, sondern an der Nebenläufigkeit.

    Ich frag mich zwar: Warum das alles?!? Was will steppenpferd mit solchen Konstruktionen erreichen? Aber ich frag es nur mich, nicht Dich …

    ##########

    Ein normaler Timer kommt nicht infrage? Der liefe im GUI-Thread.
    Oder per Async/Await ein Delay von 5 Sekunden und danach die TB neu bestücken.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Steppenpferd Warum rufst Du Clipboard.Clear() in einem zweiten Thread auf?
    Den kannst Du Dir voll sparen, wenn der Rest nebenläufig bleibt.
    ====
    Falls einer nebenbei einen Text schreibt, wird der sich sicher freuen, wenn das Clipboard gelöscht wird.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!