c# - 如何调试system.reactive的FromEvent函数中的Action M?
问题描述
我正在阅读 Captura 的源代码,发现调试动作 M 有点困难(或者我可能不理解反应式):
FromEvent 是将 c# 事件(AudioSource.DevicesUpdated)包装到一个可观察的序列中。
包含底层 .NET 事件调用的数据表示的 Observable 序列。
readonly IObservable<Unit> _refreshObservable;
_refreshObservable = Observable.FromEvent(M => AudioSource.DevicesUpdated += M,
M => AudioSource.DevicesUpdated -= M)
.Throttle(TimeSpan.FromSeconds(0.5));
_refreshObservable
.ObserveOnUIDispatcher()
.Subscribe(M => Refresh());
public event Action DevicesUpdated;
但是Action“M”的定义在哪里以及如何调试呢?谢谢!
解决方案
M
是conversion
您作为参数传递给运算符的 lambda 的参数FromEvent
。此参数由 Rx 提供。您提供 lambda,然后 Rx 使用M
内部创建的参数调用您的 lambda。此参数表示您的 lambda 应附加到event
委托的处理程序,所有这一切的发生都是因为 C# 语言对您可以对委托执行的操作施加了严格的限制event
(您只能对其应用+=
and-=
运算符)。为该参数选择的名称通常是h
(来自h andler),而不是M
.
调试 observable 的一种简单方法是在其上添加Do
操作符,如下所示:
_refreshObservable = Observable
.FromEvent(h => AudioSource.DevicesUpdated += h, h => AudioSource.DevicesUpdated -= h)
.Do(x => Console.WriteLine($"DevicesUpdated original: {x}"))
.Throttle(TimeSpan.FromSeconds(0.5))
.Do(x => Console.WriteLine($"DevicesUpdated throttled: {x}"));
推荐阅读
- sas - SAS从Excel电子表格导入单个单元格值
- puppeteer - Puppeteer-web:协议错误(目标:getBrowserContexts)不允许
- java - 可以在 Constructor for Room 数据库中使用 @Ignore 字段吗?
- amazon-web-services - 如何访问由 CDK 创建的 EC2 实例?
- c# - AADSTS501051:应用程序“{API GUID}”(DEV-API)未分配给应用程序“{API GUID}”(DEV-API)的角色
- php - 在php中使用关键字搜索多个表和列
- javascript - 使用 HTML Javascript 解析 Excel
- java - 在网格布局中设置行和列大小
- android - Gradle 构建失败,未找到 keystore.properties
- alexa - 如何获取 Alexa 技能的插槽值的数量(长度)