当前位置:  开发笔记 > 编程语言 > 正文

如何将回调转换为Rx.Observable?

如何解决《如何将回调转换为Rx.Observable?》经验,为你挑选了1个好方法。

如果外部库只提供注册回调而不是事件,那么创建Observable它的最佳方法是什么?

如果它是我可以使用的事件,Observable.FromEventPattern 但在这种情况下,我唯一的想法是Subject在每个回调中使用a 和队列事件.

有没有更好的方法来做到这一点?



1> Shlomo..:

使用Observable.Create.这是一个例子:

void Main()
{
    var target = new SampleCallbacker();
    var actionB = new Action(i => Console.WriteLine($"{i} * {i} = {i * i}."));
    target.Register(actionB);

    var observable = Observable.Create(observer =>
    {
        var action = new Action(i => observer.OnNext(i));
        target.Register(action);
        return () => target.Unregister(action);
    });

    var subscription = observable.Subscribe(i => Console.WriteLine($"From observable: {i} was fired."));

    target.Fire(1);
    target.Fire(2);
    target.Fire(3);
    Console.WriteLine("Unsusbscribing observable...");
    subscription.Dispose();
    target.Fire(4);
    target.Fire(5);
}

class SampleCallbacker
{
    private List> _actions = new List>();
    public void Register(Action action)
    {
        _actions.Add(action);
    }

    public void Unregister(Action action)
    {
        while (_actions.Remove(action))
        {} //loop remove
    }

    public void Fire(int i)
    {
        foreach (var action in _actions)
        {
            action(i);
        }
    }
}

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有