2017-05-10 5 views
0

실례 합니다만 실례 합니다만 Reactive extensions에 약간의 경험이 있습니다. 내가 원하는 것은이 같은 것입니다 : 항목을 항상 방출이 관측 주어진동시에 듣고있는 동안 subscribe 함수를 주기적으로 호출하십시오.

myObservable.Do(d => myObserver.OnNext(d)).Interval(someTime).subscribe({ Run the this code periodically with period T=sometime}); 

구두로, 필요한 것은 내부 함수를 호출하는 관찰자와 기간마다 시간 T에 연속적으로 공급에 이러한 항목입니다 subscribe. 이 함수를 언급하면 ​​myObserver 내부의 일부 함수가 호출됩니다. 위의 발췌 문장은 작동하지 않습니다. myObservable에는 Interval의 정의가 포함되어 있지 않습니다. 상황에 어떤 빛을 던지시겠습니까?

편집 : 관찰자는 들어오는 항목을 처리합니다. 따라서 내가 원하는 것은 모든 시간을 듣고 시작과 중지 과정을 모두 T마다 호출하는 것입니다. 이 프로세스는 항목을 수집하고 저장해야합니다. 약간의 시작과 멈춤이있다 memorystream. 따라서 처음으로 (StartWith(-1L)) 관찰자는 어떤 처리를 시작하고 T 초 후에 해당 절차를 중지합니다. 이 시작 및 중지 루프는 주기적으로 계속됩니다.


편집 # 2 :

나는 항목을 방출하는 IObservable<T> 있습니다. 이러한 항목은 관찰자가 수신합니다. 이 관찰자는 데이터를 처리 할 수 ​​있습니다. 내가 원했던 것은이 과정을 주기적으로 시작하고 중지하는 것이다. 즉, 관찰자는 항상 시간과 시간 데이터를 받아야합니다. t이 프로세스는 중지 된 경우 시작해야하며 이미 시작/실행중인 경우 중지해야합니다. 이 start()stop() 함수는 observer.start() 및 observer.stop()과 같은 observer의 멤버입니다. 또한 프로세스가 실행 중일 경우 참/거짓 인 관찰자 내부에 플래그/부울이 있습니다. Interval은 작동해야하지만 IObservable<T>과 작동하지 않는다고 생각합니다. 상황에 어떤 빛을 던지시겠습니까?

편집 # 3 토론의 덕분에 필요한 것을 발견했다고 생각합니다.

observable.subscribe(oberver) // observer always listening 

TimeSpan someTime = TimeSpan.FromMinutes(1.0); 
IObservable<long> myObservable = Observable.Interval(someTime); 

myObservable.Subscribe(d => 
    { 
     if (!observer.isProcessing) 
     { 
      observer.Start(); 

     }else if (observer.isProcessing) 
     { 
      observer.Stop(); 

     } 
    }); 
+0

관찰자를 언급하지 않고 문제를 설명하십시오. 옵서버를 사용하는 것은 아마도 잘못된 행동 일 것입니다. 보다 기본적인 단계에서 문제를 설명 할 수 있습니까? – Enigmativity

+0

@Enigmativity 나는 내 게시물을 약간 변경했다. 도움이되기를 바랍니다. 어떤 도움을 주셔서 감사합니다. – Darkmoor

+0

이 문제에 대해 잘못된 해결책을 강요하고 있습니다. 관찰자는'start()'또는'stop()'을 가져서는 안된다 - 관찰자는 "관찰자"여야하며 프로세스를 제어해서는 안된다. 또한 관찰자가 '관찰 가능 (Observable) <>'이라면 스스로 구현하기 때문에 일반적으로 좋지 않습니다. – Enigmativity

답변

2

Interval 직접 Observable의 오프 정적 방법입니다 - 그것은 IObservable<T> 인터페이스의 일부가 아니다. 이처럼 사용합니다 :

TimeSpan someTime = TimeSpan.FromMinutes(1.0); 
IObservable<long> myObservable = Observable.Interval(someTime); 

지금 당신은 가서 당신이 원하는 코드를 작성할 수 있습니다

myObservable 
    .Do(d => myObserver.OnNext(d)) 
    .Subscribe(d => 
    { 
     //Run the this code periodically with period T=sometime 
    }); 

당신이 그런 myObserver.OnNext(d)를 호출하는 이유를 잘 모르겠어요합니다. 그것은 코드 냄새 같아 보인다. 질문에 세부 사항을 추가 할 수 있다면 아마도 그 부분을 도울 수 있습니다.

+0

답변 해 주셔서 감사합니다. myObservable은 myObserver에 전달되어야하는 데이터 (좀 더 정확한 데이터 구조)를 보냅니다. 그래서 내가'.Do (d => myObserver.OnNext (d))'가 필요한 이유입니다. 나는'IObservable '이 내 필요에 정확하게 부합하지 않는다고 생각한다. 우리는 다른 방법으로 그것을 할 수 있습니까? 다시 한번 감사드립니다. – Darkmoor

+0

다른 세부 정보가 필요하면 알려주십시오. 또한, 그 게시물의 코드 예제가 아니라,'Interval'과 같은 것이 필요하다는 것을 알리는 문제에 대한 전반적인 개요를 제공하기 위해 제공되었습니다. 다시 한번 감사드립니다. – Darkmoor

+1

@Darkmoor - X-Y 질문을 한 것 같습니다. 당신은 Y가 당신의 문제 X에 대한 답이라고 생각하기 때문에 Y를하는 법을 물었습니다. 나는 X를하는 법을 물어야한다고 생각합니다. 나와 함께 있니? – Enigmativity