COM Port schließen --> Applikation hängt sich auf



  • Hi Folks,

    hab ein Problem mit der Bearbeitung der seriellen SS.

    Wenn der COM Port vom User geschlossen geschlossen wird (comport.Close();) während gerade eine Datenkommunikation stattfindet (comport.ReadLine()), hängt sich die Applikation auf. Auch das DOT.Net Überwachungscenter meldet sich nicht..., einfach tot...nur der Taskmanager kann noch Abhilfe schaffen.

    Wie kann ich das Schließen des COM Ports erzwingen, auch wenn gerade readline Daten abholt, ohne das sich was verklemmt?

    Dank Euch!

    Beste Grüße, Opal



  • ReadLine() ist blockierend. Wie kannst Du also gleichzeitig Close() aufrufen?

    Wohl nur über einen anderen Thread und das ist schon gefährlich genug. SerialPort ist natürlich nicht von Haus aus threadsicher.

    Zwei Möglichkeiten die mir spontan einfallen:
    1. Du synchronisierst die Zugriffe (lock, Monitor) auf das SerialPort-Objekt und setzt das ReadTimeout-Property auf einen angemessenen Wert. Der unterbrechende Aufruf muss dann maximal so lange, wie das ReadTimeout gesetzt ist, warten bevor er seinerseits exklusiven Zugriff erlangt und das Close ohne Gefahr aufrufen kann.
    Auch zwischen zwei ReadLine-Aufrufen muss bei diesem Ansatz immer geprüft werden, ob von außen ein kontrollierter Abbruch des Threads erfolgen soll.

    2. Schau Dir mal das DataReceived-Event an. Damit hast Du keinen blockierenden Aufruf und tendenziell sauberen, eventgesteuerten Code. Nur bei harten Zeitvorgaben im Kommunikationsprotokoll kann dieser Ansatz etwas schwierig und sogar ungünstig sein.

    Edit: Müdigkeitsbedingte Rechtschreibschwäche



  • Hi µ, besten Dank für Deine Rückmeldung,

    kann ich die Zusammenhänge dazu irgendwo nachlesen, bei gidf gibs nix gescheites...

    Grüße opal





  • thx, opal


Anmelden zum Antworten