首页 > 解决方案 > 如何调试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”的定义在哪里以及如何调试呢?谢谢!

标签: c#system.reactive

解决方案


Mconversion您作为参数传递给运算符的 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}"));

推荐阅读