2017-07-25 98 views
1

假設我有這樣的:復位和處置觀察到的用戶,無擴展

public class UploadDicomSet 
{ 
    public UploadDicomSet() 
    { 
     var cachCleanTimer = Observable.Interval(TimeSpan.FromMinutes(2)); 
     cachCleanTimer.Subscribe(CheckUploadSetList); 
     //Start subscriber 
    } 
    void CheckUploadSetList(long interval) 
    { 
     //Stop and dispose subscriber 
    } 
    public void AddDicomFile(SharedLib.DicomFile dicomFile) 
    { 
     //Renew subscriber, call CheckUploadSetList 2 minutes later 
    } 
} 

由1- CheckUploadSetList我想處置或AddDicomFile完成觀察到

2 - 我想重置它

作爲評論的方法。

UPDATE:

我能做到這一點通過Timer爲:

public class UploadDicomSet : ImportBaseSet 
{ 
    Timer _timer; 
    public UploadDicomSet() 
    { 
     _timer = new Timer(CheckUploadSetList, null, 120000, Timeout.Infinite); 
    } 

    void CheckUploadSetList(object state) 
    { 
     Logging logging = new Logging(LogFile); 
     try 
     { 
      _timer.Dispose(); //Stop the subscription 
           //dispose everything 
     } 
     catch (Exception exp) 
     { 
      logging.Log(ErrorCode.Error, "CheckUploadSetList() failed..., EXP:{0}", exp.ToString()); 
     } 
    } 
    public void AddDicomFile(SharedLib.DicomFile dicomFile) 
    { 
     _timer.Change(120000, Timeout.Infinite); 
    } 
} 

在此先感謝。

+0

有人能告訴我爲什麼下投票? – Aria

+0

他們幾乎從來沒有這樣做,可悲的是 –

回答

1

使用反應擴展只是一些計時器功能似乎對我來說有點矯枉過正。爲什麼不爲這個使用普通的定時器,並在給定的時間啓動/停止它?

讓我給個想法。

public class UploadDicomSet : ImportBaseSet 
{ 
    IDisposable subscription; 

    public void CreateSubscription() 
    { 
     var cachCleanTimer = Observable.Interval(TimeSpan.FromMinutes(2)); 

     if(subscription != null) 
      subscription.Dispose(); 

     subscription = cachCleanTimer.Subscribe(s => CheckUploadSetList(s)); 
    } 

    public UploadDicomSet() 
    { 
     CreateSubscription(); 
     // Do other things 
    } 

    void CheckUploadSetList(long interval) 
    { 
     subscription.Dispose(); // Stop the subscription 
     // Do other things 
    } 

    public void AddDicomFile(SharedLib.DicomFile dicomFile) 
    { 
     CreateSubscription(); // Reset the subscription to go off in 2 minutes from now 
     // Do other things 
    } 
} 

背景材料

我真的可以推薦這些網站:

http://www.introtorx.com/

http://rxwiki.wikidot.com/101samples

+0

它不工作,使用Option2,即使在'subscription.Dispose()'之後,'CheckUploadSetList'每2分鐘就會調用一次。 – Aria

+0

感謝您的關注,我沒有測試選項1,我正在調試它並在那裏設置斷點,它正在調用無窮大,關於選項1我將測試它並通知您有關結果。 – Aria

+0

讓我發佈我測試過的代碼,如果兩分鐘內沒有變化,我需要調用'CheckUploadSetList',在AddDicomFile中有新的更改到達,因此如果'CheckUploadSetList'需要一個更新,訂閱者應該在兩分鐘後更新我想在那裏處理所有事情,我做了選擇2它不起作用,我會測試他們並告訴你反饋。 – Aria

1

你應該使用Switch()對於這種事情。

事情是這樣的:

public class UploadDicomSet : ImportBaseSet 
{ 
    IDisposable subscription; 
    Subject<IObservable<long>> subject = new Subject<IObservable<long>>(); 

    public UploadDicomSet() 
    { 
     subscription = subject.Switch().Subscribe(s => CheckUploadSetList(s)); 
     subject.OnNext(Observable.Interval(TimeSpan.FromMinutes(2))); 
    } 

    void CheckUploadSetList(long interval) 
    { 
     subject.OnNext(Observable.Never<long>()); 
     // Do other things 
    } 

    public void AddDicomFile(SharedLib.DicomFile dicomFile) 
    { 
     subject.OnNext(Observable.Interval(TimeSpan.FromMinutes(2))); 
     // Reset the subscription to go off in 2 minutes from now 
     // Do other things 
    } 
} 
+0

感謝您的回答,'switch'真的做了什麼? – Aria

+0

@Aria - '.Switch()'切換到最新的內部可觀察。因此,通過僅輸出最新的內部可觀察值來將'IObservable >'平整爲'IObservable '。這意味着您不必取消訂閱並重新訂閱即可從可觀察數據中獲得全新的價值。 – Enigmativity

+0

Up +,所以你認爲它比舊的更有效率 – Aria