每次更改属性(布尔值)时,我都会尝试调用一个事件。有INotifyPropertyChanged接口,但它适用于您自己编写的属性。我有一个带有Connected属性的tcp套接字。目前我使用while循环来检查连接状态,但我想知道是否有办法处理事件。
贲
答案 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)
您可以尝试/遵循观察者/可观察模式......