observablecollection - 重大更改破坏了 Rx 示例

标签 observablecollection system.reactive

Rx Wiki 的 101 Rx Samples 中有一些样本实际上不再有效。我认为这是因为我有最新的 Rx 版本 (1.0.10621.2),但我想确认并看看如何让它们工作。

例如,下面的示例代码不起作用:

class ObserveEvent_Generic
{
    public class SomeEventArgs : EventArgs { }
    public static event EventHandler<SomeEventArgs> GenericEvent;

    static void Main()
    {
        // To consume GenericEvent as an IObservable:
        IObservable<IEvent<SomeEventArgs>> eventAsObservable = Observable.FromEvent<SomeEventArgs>(
            ev => GenericEvent += ev,
            ev => GenericEvent -= ev);
    }
}

缺少 IEvent,“ev => GenericEvent += ev”导致“无法将类型 System.Action<xxx> 隐式转换为 System.EventHandler<xxx> 错误。

最佳答案

在这种情况下,您有几种选择。第一个是提供一个与标准 EventHandler 模式匹配的委托(delegate)(生成的 Observable 的类型为 IObservable<SomeEventArgs> )。请注意我提供的 lamda 接受“o”(“发件人”),但未使用此参数:

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<SomeEventArgs>
(
    ev => GenericEvent += (o,e) => ev(e),
    ev => GenericEvent -= (o,e) => ev(e)
);

特别是在您的情况下(静态事件...哎呀!),我不愿相信取消订阅会真正正确地清理,并且您可能会根据使用情况最终导致严重的内存泄漏。或者,您可以指定委托(delegate)类型。注意这里额外的通用参数 FromEvent

IObservable<SomeEventArgs> eventAsObservable = 
Observable.FromEvent<EventHandler<SomeEventArgs>, SomeEventArgs>
(
    ev => GenericEvent += ev,
    ev => GenericEvent -= ev
);

将源/发送者对象的处理移至 Observer(使类型为 IObservable<EventPattern<SomeEventArgs>> 的可观察对象)的另一种选择是使用 FromEventPattern方法。我在某些构建中使用此方法遇到了一些麻烦,因此您的里程可能会有所不同,但这是替代方案:

IObservable<EventPattern<SomeEventArgs>> eventAsObservable = 
Observable.FromEventPattern<SomeEventArgs>
(
    ev => GenericEvent += ev,
    ev => GenericEvent -= ev
);

希望这对您有所帮助。

关于observablecollection - 重大更改破坏了 Rx 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8751903/

相关文章:

c# - 使用 Rx 阻塞(并可能超时)异步操作

c# - 从 ObservableCollection 实现 ListCollectionView

c# - 当项目直接添加到数据库时,ObservableCollection 不会更新

c# - 执行后处置ReactiveCommand

c# - Rx 处置订阅

.net - 使用 Reactive Extensions (Rx) 创建 REST 客户端 API

.net - 使用 lambda 的 ObservableCollection 切片

c# - 我网格中的数据没有更新

c# - 从另一个集合更新集合的有效方法

swift - 如何跟踪 rxSwift 是否更改了 textField 值?