听取不同班级的物业

时间:2017-07-10 11:07:25

标签: c# sockets

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

3 个答案:

答案 0 :(得分:0)

如果基础类不支持它,则无法监视类属性的更改。

答案 1 :(得分: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,它每500ms验证其基类的Connected属性的状态。状态更改后,使用Connected接口更新子类的INotifyPropertyChanged属性。

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

答案 2 :(得分:0)

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