2013-04-23 64 views
0

我對Rx相當新,並且無法找到解決方案來解決我的問題。我正在使用Rx通過客戶端庫開始下載。目前,它看起來像:緩衝訂閱的無功擴展

private void DownloadStuff(string descriptor, Action<Stuff> stuffAction) 
{ 
    this.stuffDownloader.GetStuffObservable(descriptor).Subscribe(x => stuffAction(x)) 
} 

where stuffDownloader是在客戶端庫中定義的下載邏輯的包裝。但是我遇到了一個問題,那就是我太多地調用了DownloadStuff,導致很多下載,並且壓倒了系統。現在我想要做的是

private void DownloadStuff(string descriptor, Action<Stuff> stuffAction) 
{ 
    this.stuffDownloader.GetStuffObservable(descriptor) 
     .SlowSubscribe(TimeSpan.FromMilliSeconds(50)) 
     .Subscribe(x => stuffAction(x)) 
} 

其中,SlowSubscribe是Rx操作的一些組合,僅在某個時間間隔訂閱。

通常我會將這些DownloadStuff調用放在一個隊列中並在一段時間內關閉它們,但最近我一直試圖通過Rx做更多的事情。我發現了三種解決方案:

  1. 此功能存在,並且可以在訂閱端完成。
  2. 這是可能的,但下載器的基礎設施是不正確的,應該改變(即stuffDownloader需要有不同的行爲)
  3. 這不應該與Rx,做另一種方式。

發生在我身上#2可能通過將IObservable的描述符傳遞給客戶端庫,並以某種方式減慢描述符進入Observable的方式。

+0

你真正的問題是什麼? – 2013-05-22 19:05:59

回答

-1

您可能理論上使用Rx將您的請求視爲事件。這樣你可以利用Rx的序列化特性來排隊下載。

我會認爲你的網絡層(或stuffDownloader)會爲你做這個,但如果你想加入我的黑客....這就是我已經提出(Yeehaw !!)

1. 不要通過一個動作,使用Rx!你基本上失去了這裏的錯誤處理,並設置了自己的奇怪的未處理的異常。

private void DownloadStuff(string descriptor, Action<Stuff> stuffAction) 

成爲

private IObservable<Stuff> DownloadStuff(string descriptor) 

2. 現在我們只是有一個方法調用另一個。似乎毫無意義。扔掉抽象。

3. 修復底層。對我來說stuffDownloader並沒有做它的工作。更新接口以採用IScheduler。現在,你可以通過它的專用EventLoopScheduler執行工作

public IObservable<Stuff> GetStuffObservable(string descriptor, IScheduler scheduler) 

4. 修復的執行序列化? 正如你想序列化你的請求(HMMM ....),你可以讓電話同步。

private Stuff GetSync(string description) 
{ 
    var request = (HttpWebRequest)WebRequest.Create("http://se300328:90/"); 
    var response =request.GetResponse(); 
    var stuff = MapToStuff(response); 
    return stuff; 
} 

現在,你只需要調用,在你其他的方法

public IObservable<Stuff> GetStuffObservable(string descriptor, ISchedulerLongRunning scheduler) 
{ 
    return Observable.Create<Stuff>(o=> 
     { 
      try 
      { 
       var stuff = GetStuff(description); 
       o.OnNext(stuff); 
       o.OnCompleted(); 
      } 
      catch(Exception ex) 
      { 
       o.OnError(ex); 
      } 
      return Disposable.Empty(); //If you want to be sync, you cant cancel! 
     }) 
     .SubscribeOn(scheduler); 
} 

然而,成就了這一切,我敢肯定這是不是你真正想要的。我希望在系統的其他地方出現問題。

另一種選擇是考慮使用合併運算符,它是最大的concurent功能?

+0

很好的建議,但不是一個答案。這個問題很模糊,但他們需要幫助,「我打電話給DownloadStuff太多了,導致很多下載,並且壓倒了系統。」 – 2013-05-22 19:08:56

+0

是的,它似乎並不像用戶對答案很感興趣,或者澄清他們的問題。 – 2013-05-23 14:50:41