C# 如何检测变量的变化并在c中获取变量的值#
我已使用C# 如何检测变量的变化并在c中获取变量的值#,c#,C#,我已使用属性更改事件为bool值分配一个值,以尝试获取连接状态 但是,我想听听另一个类中变量的这种变化,并执行一些操作。如何在C#中实现这一点 在另一个类中,它基本上是一个服务,我想监听变量IsDisconnected。请有人帮帮我 我的服务类别: [return: GeneratedEnum] public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags fl
属性更改事件
为bool
值分配一个值,以尝试获取连接状态
但是,我想听听另一个类中变量的这种变化,并执行一些操作。如何在C#
中实现这一点
在另一个类中,它基本上是一个服务
,我想监听变量IsDisconnected
。请有人帮帮我
我的服务类别:
[return: GeneratedEnum]
public override StartCommandResult OnStartCommand(Intent intent, [GeneratedEnum] StartCommandFlags flags, int startId)
{
try
{
Toast.MakeText(this, "Background service started", ToastLength.Long);
t = new Thread(() =>
{
Task.Run(async () =>
{
ConnectionListener gatt = new ConnectionListener ();
gatt.PropertyChanged += (s, e) =>
{
if (e.PropertyName == nameof(GattCallback.IsDisconnected))
{
}
};
});
});
t.Start();
}
}
假设类的实例名为
connection
。然后从另一个类连接PropertyChanged
事件:
connection.PropertyChanged += (s,e) =>
{
if (e.PropertyName == nameof(YourClass.IsDisconnected))
{
//isDisconnected changed, perform your logic
}
}
当然,这只是一个示例代码,如果两个实例具有不同的生存期,那么将事件处理移动到一个方法是合适的。通过这样做,您可以稍后取消订阅该活动,这样就不会导致内存泄漏
您还需要更新GattCallback
类以设置IsDisconnected
属性,而不是OnConnectionChange
方法中的IsDisconnected
字段:
if(newState == ProfileState.Connected)
{
IsDisconnected = false; //notice change true -> false
gatt.DiscoverServices();
}
else if(newState == ProfileState.Disconnected)
{
gatt.Close();
IsDisconnected = true;
Log.Info("BLE", "Status: Disconnected");
}
另外,您似乎有一个bug—在这两种情况下,您都将
IsDisconnected
设置为true
,这可能不是您想要的。假设您的类的实例名为connection
。然后从另一个类连接PropertyChanged
事件:
connection.PropertyChanged += (s,e) =>
{
if (e.PropertyName == nameof(YourClass.IsDisconnected))
{
//isDisconnected changed, perform your logic
}
}
当然,这只是一个示例代码,如果两个实例具有不同的生存期,那么将事件处理移动到一个方法是合适的。通过这样做,您可以稍后取消订阅该活动,这样就不会导致内存泄漏
您还需要更新GattCallback
类以设置IsDisconnected
属性,而不是OnConnectionChange
方法中的IsDisconnected
字段:
if(newState == ProfileState.Connected)
{
IsDisconnected = false; //notice change true -> false
gatt.DiscoverServices();
}
else if(newState == ProfileState.Disconnected)
{
gatt.Close();
IsDisconnected = true;
Log.Info("BLE", "Status: Disconnected");
}
另外,您似乎有一个bug-在这两种情况下,您都将
IsDisconnected
设置为true
,这可能不是您想要的。您必须订阅此事件,并且当为IsDisconnected
属性引发此事件时,按您想要的方式进行操作。在引发事件时,您收到的参数中包含有关更改所涉及的属性的信息。如何进一步实现此信息?如果此其他类已具有对带有事件的类的访问权限,则它将如下所示connectionListener.PropertyChanged+=OnPropertyChanged
和private voidOnPropertyChanged(对象发送方,PropertyChangedEventArgs){if(args.PropertyName==nameof(connectionListener.IsDisconnected)){DoSomething();}}}
@yoger:我已经在上面的服务中添加了代码,但是它没有命中if(e.PropertyName==nameof)(GattCallback.IsDisconnected))
您能提供建议吗?您是否尝试过调试以验证是否确实引发了事件?如果是,属性名称是否有效?您必须订阅此事件,以及何时引发IsDisconnected
property act。有关更改关注的属性的信息包含在您收到的参数中当引发事件时,如何进一步实现此操作?如果此其他类已具有对具有事件的类的访问权限,则类似于connectionListener.PropertyChanged+=OnPropertyChanged
和private void OnPropertyChanged(对象发送方,PropertyChangedEventArgs){If(args.PropertyName==nameof(connectionListener.IsDisconnected)){DoSomething();}}
@yoger:我已经在上面的服务中添加了代码,但是它没有击中if(e.PropertyName==nameof(GattCallback.IsDisconnected))
您能提供建议吗?您是否尝试过调试以验证是否确实引发了事件?如果是,属性名称是否有效?基本上,我的服务
是我应用程序中的后台服务类。您认为它会起作用吗?我已在上面的服务中添加了代码,但它没有命中If(e.PropertyName==nameof)(GattCallback.IsDisconnected))
您能提供建议吗?您必须在OnConnectionChange
方法中指定IsDisconnected
属性,而不是IsDisconnected
字段,以便执行setter并触发PropertyChanged
事件。基本上,我的服务
是我的应用程序中的后台服务类o你认为它会工作吗?我已经在上面的服务中添加了代码,但是它没有达到if(e.PropertyName==nameof(GattCallback.IsDisconnected))
您能提供建议吗?您必须在OnConnectionChange
方法中指定IsDisconnected
属性,而不是IsDisconnected
字段,以便执行setter并触发PropertyChanged
事件。