如何将匿名事件处理程序重构为正确的"delegate?"



好的,我知道有一些类似的问题,如:

添加和删除匿名事件处理程序c#中的取消订阅匿名方法

但是我不理解委托的概念。

我开始使用这个插件。. net Maui应用中的BLE

扫描操作从一个按钮开始,然后要么超时(通过使用定时器),要么再次按下按钮停止。

然而,在我的按钮命令(MVVM)我有以下代码片段:

...
adapter.DeviceDiscovered += (s, a) =>
{
if (a.Device.Name != null && a.Device.Name != String.Empty)
{
...
}
};
await adapter.StartScanningForDevicesAsync();
...

我注意到,每次我按下按钮,我得到两个更多的发现项目(我不知道为什么我得到2个吗?)(这是从Pixel 5模拟器)

这在某种程度上是有意义的,因为我正在向同一个适配器添加另一个事件!

所以我需要转换匿名函数

adapter.DeviceDiscovered += (s, a) =>
{
}

变成一个非匿名函数,这样我就可以添加处理程序,然后在计时器停止或停止函数时删除它。

我不知道该怎么做,尤其是在处理s和a的时候。

我很感激任何指针,代码。

谢谢,g .

编辑:链接到插件。BLE https://github.com/xabre/xamarin-bluetooth-le

嗯,我真的被Visual Studio惊呆了。

在尝试创建函数和委托一段时间后,我注释掉了代码并输入

adapter.DeviceDiscovered +=

和visual studio为我创建了其余的代码和事件处理程序。

所以我有:

adapter.DeviceDiscovered += Adapter_DeviceDiscovered;
...
private void Adapter_DeviceDiscovered(object s, Plugin.BLE.Abstractions.EventArgs.DeviceEventArgs a)
{
Debug.WriteLine("Got here");
}

我将原来的发送者更改为s,将原来的e更改为a,以匹配我使用的代码。

到目前为止,它似乎有效。

现在我需要做的就是弄清楚为什么这个被调用两次!:叹息。:)

最新更新