【发布时间】:2017-07-10 19:42:25
【问题描述】:
我试图在每次更改属性(布尔值)时调用一个事件。有 INotifyPropertyChanged 接口,但它适用于您自己编写的属性。我有一个带有 Connected 属性的 tcp 套接字。目前我正在使用 while-loop 来检查连接状态,但我想知道是否有办法通过事件来处理。
本
【问题讨论】:
我试图在每次更改属性(布尔值)时调用一个事件。有 INotifyPropertyChanged 接口,但它适用于您自己编写的属性。我有一个带有 Connected 属性的 tcp 套接字。目前我正在使用 while-loop 来检查连接状态,但我想知道是否有办法通过事件来处理。
本
【问题讨论】:
如果底层类不支持,则无法监控类属性的变化。
【讨论】:
您唯一的选择是创建这样的派生类:
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 接口进行更新。
这是个好主意吗?这实际上取决于您在做什么,线程是相当资源密集型的,尤其是在创建它们时。这可能很快成为一种相关的资源浪费。您可能可以通过重新思考您的方法来实现您想要做的事情。
【讨论】:
您可以尝试/遵循观察者/可观察模式...
【讨论】: