![](/img/trans.png)
[英]EventHandler to Reactive Extensions where event handler is transient lifestyle
[英]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.