[英]Reactive extensions dispose event handler
Hi guys I have a ExternalDataService that is constantly firing real time data, it is contained in a lib. 嗨,大家好,我有一个ExternalDataService,它会不断触发实时数据,它包含在一个lib中。
I have a wrapper class that subscribes and puts the updates on a Observable.. 我有一个包装器类,用于订阅并将更新放在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? 当在一次性设备上调用
Dispose
时,如何取消订阅_externalPriceService.OnDataChanged
?
Use Observable.FromEvent or Observable.FromEventPattern, instead of Observable.Create. 使用Observable.FromEvent或Observable.FromEventPattern,而不是Observable.Create。 Then you just Dispose the subscription.
然后,您只需处置订阅。
Depending on your EventHandler definition, it would be something like this: 根据您的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);
}
}
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 编辑:愚蠢的错别字
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.