2017-07-25 11 views
1

、観察可能な加入者を処分:私はそれリセットと私はこれがあると、反応性の拡張

をリセットしたい AddDicomFileで観測可能

2-処分または終了したいCheckUploadSetList

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-方法のコメントとして

UPDATE:

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

事前に感謝を:

私はとしてTimerでそれを行うことができます。

+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 
    } 
} 

私は本当にこれらのサイトをお勧めすることができます

背景素材:あなたはこの種のもののためにSwitch()を使用する必要があります

http://www.introtorx.com/

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

+0

Option2で 'CheckUploadSetList'が' subscription.Dispose() 'の後でも2分ごとに呼び出しています。 – Aria

+0

ご注意いただきありがとうございます。私はオプション1をテストしていませんでした。デバッグしていましたが、そこでは無限大と呼ばれるブレークポイントを設定しました。オプション1についてテストし、結果をお知らせします。 – Aria

+0

テストされたコードを投稿させてください。2分間の変更がなければ 'CheckUploadSetList'を呼び出し、' AddDicomFile'では新しい変更が到着したので、 'CheckUploadSetList'が呼び出された場合、私はそこにすべてを処分したい、私はオプション2を働かせませんでした、私はそれらの両方をテストし、フィードバックを伝えます。 – Aria

1

。このような

何か:

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

答えてくれてありがとう、「スイッチ」は本当に何をしていますか? – Aria

+0

@Aria - '.Switch()'は、最新の内部observableに切り替えます。したがって、 'IObservable >'を 'IObservable 'にフラット化するのは、最新の内部観測値から値を出力するだけです。これは、あなたが購読を解除して再購読する必要がなくなり、観察可能なものから全く新しい価値を得ることができるということです。 – Enigmativity

+0

アップ+、あなたはそれが古いよりも効率的だと思います – Aria

関連する問題