簡體   English   中英

反應性擴展處置事件處理程序

[英]Reactive extensions dispose event handler

嗨,大家好,我有一個ExternalDataService,它會不斷觸發實時數據,它包含在一個lib中。

我有一個包裝器類,用於訂閱並將更新放在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?
            };
        });
    }    

}

消耗為...

var p = new MyService();

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

當在一次性設備上調用Dispose時,如何取消訂閱_externalPriceService.OnDataChanged

使用Observable.FromEvent或Observable.FromEventPattern,而不是Observable.Create。 然后,您只需處置訂閱。

根據您的EventHandler定義,可能是這樣的:

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);
    }       
}

您還可以執行以下操作:

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;
        });
    });
}    

編輯:愚蠢的錯別字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM