【问题标题】:Listening for properties in different class监听不同类的属性
【发布时间】:2017-07-10 19:42:25
【问题描述】:

我试图在每次更改属性(布尔值)时调用一个事件。有 INotifyPropertyChanged 接口,但它适用于您自己编写的属性。我有一个带有 Connected 属性的 tcp 套接字。目前我正在使用 while-loop 来检查连接状态,但我想知道是否有办法通过事件来处理。

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    如果底层类不支持,则无法监控类属性的变化。

    【讨论】:

      【解决方案2】:

      您唯一的选择是创建这样的派生类:

          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,它每 500 毫秒验证其基类的 Connected 属性的状态。一旦状态发生变化,子类的Connected 属性就会使用INotifyPropertyChanged 接口进行更新。

      这是个好主意吗?这实际上取决于您在做什么,线程是相当资源密集型的,尤其是在创建它们时。这可能很快成为一种相关的资源浪费。您可能可以通过重新思考您的方法来实现您想要做的事情。

      【讨论】:

      • 此代码的行为可能与预期不同 - 它很容易错过从 True 到 False 并再次返回 True 的转换。如果状态更改是永久性的(即 True 到 False 永远无法转换回 True),那么这会通知属性 HAD 已更改,而不是它已更改 - 即它具有固有的延迟;这本身可能是有问题的。一个很好的综合答案 - 但想指出该方法的局限性。
      • @PhillipH,是的,这种方法远非解决方案。事实上,我赞成你的回答,因为我同意它不能/不应该做。我只是想提供一种解决方法,可用于向用户提供某种状态反馈。至少对于前面描述的场景而言,代码肯定可以改进以变得更加可靠。
      【解决方案3】:

      您可以尝试/遵循观察者/可观察模式...

      【讨论】:

        猜你喜欢
        • 2021-05-05
        • 1970-01-01
        • 1970-01-01
        • 2017-05-16
        • 2018-11-28
        • 2013-01-20
        • 2011-06-13
        • 1970-01-01
        相关资源
        最近更新 更多