2013-05-04 185 views
0

嗨,大家好,我有一个ExternalDataService,它不断发射实时数据,它包含在lib中。Reactive extensions处理事件处理程序

我有赞同,并提出一个可观测的更新包装类..

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

我怎么会从_externalPriceService.OnDataChanged取消当Dispose被称为在一次性?

回答

3

使用Observable.FromEvent或Observable.FromEventPattern而不是Observable.Create。然后你只需处理订阅。

根据您的事件处理程序的定义,这将是这样的:

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

感谢您的答复,你会介意使用我的代码片段向我展示一个例子吗?谢谢 – Andy 2013-05-06 10:11:40

+0

@Andy自己尝试一下,查看所列方法的文档,并搜索现有示例。如果在这样做之后,你仍然遇到问题,那么编辑问题(或者询问一个新问题),结合你所尝试的内容,以及为什么它不起作用。 – Servy 2013-05-06 16:17:14

+0

@Andy为你更新了我的答案。 – 2013-05-07 19:47:39

2

你也可以做这样的事情:

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

编辑:愚蠢的错别字