2012-01-21 2 views
3

는 설정 :하는 다른 유형의 두 가지 소스를 결합하는 방법을

  • 먼저 IObservable 유형 의 값을 생성하는
  • 둘째 IObservable 유형 B 그들은 생산
  • 의 값을 생성 각기 다른 속도의 가치 (매우 빠른, 매 10ms마다)
내가 달성하기 위해 노력하고 무엇

:

모든 N 시간 통화가 모두 먼저두 번째에서 최신 값을 서비스에 수행하고 제공해야한다 (N은 매우 느린 약 500 밀리)IObservable.

질문 : RX를 사용하여 어떻게 할 수 있을지 궁금합니다.

현재 솔루션 (비 작동) :

var stateObs = from drag in dragObs.MostRecent(0).ToObservable() 
       from roll in rollObs.MostRecent(0).ToObservable() 
       select new ClientState 
          { 
           FileDragPerc = drag, 
           PhoneRoll = roll, 
           PendingFileType = FileType.Image, 
           TransferState = TransferState.SelectiveTransfer 
          }; 

stateObs.Sample(TimeSpan.FromMilliseconds(300)) 
     .Subscribe(x => _lsService.SetClientStateAsync(x), 
        x => Debug.WriteLine("Error in observable "), 
        () => Debug.WriteLine("Error observable finished! ")); 

답변

2

정확합니다. 즉 CombineLatest 운전자가 무엇이다 : 어느 시퀀스의 마지막 값은 한 쌍의 절환 동작을 생성하는 유지

A: 1...2...3...4...5... 

B: a.....b.........c... 

. 출력 스트림은 (1,a) (2,a) (2,b) (3,b) 등이됩니다.

스트림에서 적절한 쌍을 구성해야하는 경우 'Zip'연산자를 사용하면 (1,a) (2,b) (3,c) 등이 표시됩니다.

P.

필자는 컴파일러가 쿼리 이해를 다시 작성하는 방법을 더 잘 이해하려고 시도 할 것을 제안합니다. 그것은 당신의 혼란의 대부분을 해결할 것입니다.

from a in oA 
from b in oB 
select ... 

효과적으로 SelectMany(oA, oB)

+0

엡이다, 우편 번호와 문제는 하나의 소스가 하나 개의 뜻을 다른 뒤에 지퍼 빠른 일으키기 속도가하고있는 경우이기 때문이다. – Vitalij

+0

@Vitalij Rx에 대해 쿼리 이해 구문을 사용하지 말 것을 권합니다. 대부분의 연산자는 사용할 수 없으므로 결국 메서드 연산자와 결합하면 모든 것이 엉망이 될 것입니다. – Asti

1

내가 답을 찾은 것 같아 자신

CombineLatest() 작업은 그냥 이 그래서 내가 무엇을 얻을 필요한 작업 :

var stateObs = dragObs.CombineLatest(rollObs, (d, r) => new ClientState 
                 { 
                  FileDragPerc = d, 
                  PhoneRoll = r, 
                  TransferState = TransferState.SelectiveTransfer, 
                  PendingFileType = FileType.Image 
                 }); 

    stateObs.Sample(TimeSpan.FromMilliseconds(300)) 
      .Subscribe(x => _lsService.SetClientStateAsync(x), 
         x => Debug.WriteLine("Error in observable "), 
         () => Debug.WriteLine("Error observable finished! ")); 
관련 문제