2013-05-04 228 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; 
     }); 
    }); 
}  

編輯:愚蠢的錯別字