2017-07-10 4 views
0

Ich versuche jedes Mal ein Ereignis aufzurufen, wenn eine Eigenschaft (boolean) geändert wird. Es gibt die INotifyPropertyChanged-Schnittstelle, aber es funktioniert mit Eigenschaften, die Sie selbst schreiben. Ich habe einen TCP-Socket mit der Eigenschaft Verbunden. Derzeit verwende ich eine while-Schleife, um den Verbindungsstatus zu überprüfen, aber ich möchte wissen, ob es einen Weg gibt, mit Ereignissen umzugehen.Hören auf Eigenschaften in verschiedenen Klassen

ben

Antwort

0

wenn die zugrunde liegende Klasse nicht unterstützt wird, gibt es keine Möglichkeit der Überwachung für die Änderung der Klasseneigenschaft.

0

Ihre einzige Möglichkeit wäre, eine abgeleitete Klasse wie folgt zu erstellen:

public class MySocket : System.Net.Sockets.Socket, INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     private bool _connected = false; 
     private Thread _pollingThread; 

     public new bool Connected 
     { 
      get { return _connected; } 
      private set { _connected = value; NotifyPropertyChanged(); } 
     } 

     public MySocket() : base (System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp) 
     { 
      _pollingThread = new Thread(PollingThread); 
      _pollingThread.IsBackground = true; 
      _pollingThread.Start(); 
     } 

     protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "") 
     { 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private void PollingThread() 
     { 
      while (true) { 
       Thread.Sleep(500); 
       if (base.Connected != Connected) Connected = base.Connected; 
      } 
     }    
    } 

Dies ist nur ein Beispiel ungetestet ist es, Ihnen eine allgemeine Vorstellung davon zu geben, was getan werden könnte.

Diese Klasse startet eine separate Thread, die den Status der Connected Eigenschaft seiner Basisklasse alle 500ms überprüft. Sobald sich der Status ändert, wird die Eigenschaft Connected der untergeordneten Klasse mithilfe der Schnittstelle INotifyPropertyChanged aktualisiert.

Ist das eine gute Idee? Das hängt wirklich davon ab, was Sie tun, Threads sind ziemlich ressourcenintensiv, besonders wenn sie erstellt werden. Dies könnte schnell zu einer relevanten Ressourcenverschwendung werden. Sie können wahrscheinlich erreichen, was Sie versuchen, indem Sie Ihren Ansatz neu denken.

+1

Dieser Code möglicherweise nicht wie erwartet verhalten - es könnte leicht einen Übergang von True auf False verpassen und wieder auf True zurück. Wenn die Zustandsänderung permanent war (d.h. Wahr zu Falsch konnte niemals wieder zu Wahr zurückübergehen), teilt dies mit, dass sich die Eigenschaft HAD geändert hat, nicht dass sie sich geändert hat - d.h. sie hat eine inhärente Verzögerung; was selbst problematisch sein könnte. Eine nette umfassende Antwort - aber wollte die Grenzen der Methode aufzeigen. – PhillipH

+0

@PhillipH, wahr, dieser Ansatz ist bei weitem keine Lösung. In der Tat habe ich Ihre Antwort erneuert, da ich zustimme, dass es nicht getan werden kann/sollte. Ich wollte nur eine Problemumgehung bereitstellen, die verwendet werden könnte, um dem Benutzer eine Art Statusfeedback bereitzustellen. Der Code kann sicherlich verbessert werden, um zumindest für den Zweck des zuvor beschriebenen Szenarios ein wenig zuverlässiger zu werden. – r41n

0

Sie können versuchen,/folgen dem Betrachter/beobachtbaren Muster ...

Verwandte Themen