2017-07-10 9 views
0

プロパティ(ブール値)が変更されるたびにイベントを呼び出そうとしています。 INotifyPropertyChangedインターフェイスがありますが、自分で作成したプロパティで動作します。私はConnectedプロパティを持つTCPソケットを持っています。現在、私はwhileループを使用して接続状態をチェックしていますが、これをイベントで処理する方法があるかどうかを知りたいのです。異なるクラスのプロパティのリッスン

ベン

答えて

0

基本となるクラスがそれをサポートしていない場合は、クラスのプロパティの変更を監視する方法はありません。

0

あなたの唯一のオプションは、次のように派生クラスを作成するには、次のようになります。

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; 
      } 
     }    
    } 

これはあなたに何ができるかの一般的なアイデアを与えるためだけにテストしていない例です。

このクラスは別のThreadを開始し、Connectedの基本クラスのプロパティの状態が500msごとに確認されます。状態が変更されるとConnected子クラスのプロパティはINotifyPropertyChangedインターフェイスを使用して更新されます。

これは良い考えですか?これは本当にあなたがやっていることに依存します。これはすぐに関連するリソースの無駄になる可能性があります。あなたはおそらく、あなたのアプローチを再考することによって、あなたがやろうとしていることを達成することができます。

+1

...オブザーバー/観測可能なパターンをたどる/試すことができます - それは簡単に再びTrueに真から偽への移行を欠場し、可能性があります。状態の変更が永続的であった場合(すなわち、TrueからFalseはTrueに戻ることができない)、これはプロパティHADが変更されたことではなく、固有の遅延を有することを通知する。それ自体が問題になる可能性があります。 素晴らしい包括的な答えですが、メソッドの限界点を指摘したかったのです。 – PhillipH

+0

@PhillipH、本当に、このアプローチは解決策にはほど遠いです。私はそれができない/できないことに同意するので、実際に私はあなたの答えをupvoted。私はちょうどユーザーにある種の状態フィードバックを提供するために使用されるかもしれない回避策を提供したいと思った。前述のシナリオの目的では、少なくとも確実にコードを改善して信頼性を高めることができます。 – r41n

0

あなたは予想通り、このコードは動作しない可能性がある

関連する問題