Andy
Andy

Reputation: 1193

Reactive extensions dispose event handler

Hi guys I have a ExternalDataService that is constantly firing real time data, it is contained in a lib.

I have a wrapper class that subscribes and puts the updates on a Observable..

   public class MyService
    {
        private ExternalDataService _externalDataService;

    public MyService()
    {
        _externalDataService= new ExternalDataService ();
    }


    public IObservable<double> GetData()
    {
        return Observable.Create<double>(i => 
        {   
            _externalPriceService.OnDataChanged += (s, e) => { i.OnNext(e); };


            return () => 
            {
              //  what do I do here?
            };
        });
    }    

}

Consumed as...

var p = new MyService();

var disposable = p.GetData().Subscribe(i => Console.WriteLine(i));

How would I unsubscribe from _externalPriceService.OnDataChanged when the Dispose is called on disposable?

Upvotes: 1

Views: 1349

Answers (2)

Richard Anthony Hein
Richard Anthony Hein

Reputation: 10650

Use Observable.FromEvent or Observable.FromEventPattern, instead of Observable.Create. Then you just Dispose the subscription.

Depending on your EventHandler definition, it would be something like this:

public class ExternalDataService {
    public EventHandler<DataChangedEventArgs> OnDataChanged;    
}

public class DataChangedEventArgs : EventArgs {
    public Double Data {
        get; set;
    }
}

public class MyService {
    private ExternalDataService _externalDataService;
    public MyService()
    {
        _externalDataService= new ExternalDataService ();
    }
    public IObservable<double> GetData()
    {
        return Observable.FromEventPattern<DataChangedEventArgs>(eh => _externalDataService.OnDataChanged += eh, eh => _externalDataService.OnDataChanged -= eh)
            .Select(e => e.EventArgs.Data);
    }       
}

Upvotes: 3

JerKimball
JerKimball

Reputation: 16894

You can also do something like this:

public IObservable<double> GetData()
{
    Action<object, double> dataHandler = null;
    return Observable.Create<double>(i => 
    {   
        dataHandler = (s, e) => { i.OnNext(e); };;
        _externalDataService.OnDataChanged += dataHandler;
        return Disposable.Create(() => 
        {
            _externalDataService.OnDataChanged -= dataHandler;
        });
    });
}    

edit: stupid typos

Upvotes: 2

Related Questions