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

Tho*_*mas 1 system.reactive

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

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

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

Shl*_*omo 5

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

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

    var observable = Observable.Create<int>(observer =>
    {
        var action = new Action<int>(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<Action<int>> _actions = new List<System.Action<int>>();
    public void Register(Action<int> action)
    {
        _actions.Add(action);
    }

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

    public void Fire(int i)
    {
        foreach (var action in _actions)
        {
            action(i);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)