2012-01-04 2 views
9

Reactive Extensions의 이전 버전에는 IEnumerable에 대한 실행 및 확장 확장 방법이 모두 있습니다. 둘 다 똑같은 일을하는 것처럼 보입니다. 나는 그 차이를 확신 할 수 없습니다.Rx에서 Run과 Do의 차이점은 무엇입니까?

이전 코드를 업그레이드하고 Do가 Ix (아직 안정적인 릴리스가 아닌)로 옮겨 졌기 때문에 묻습니다. Run이 ForEach로 대체 된 것 같습니다.

+0

조나단, 답변이 도움이 되었습니까? 그렇다면 답변으로 표시하십시오. 감사! –

+1

궁금한 분은 새로운 Rx 빌드에서 "Run"과 동등한 기능을 Observable.Wait() 확장 메소드라고합니다. 이 메소드는 최종 값 또는 예외가 관찰 가능 소스에서 수신 될 때까지 실행을 차단합니다. 이를 호출하면 등록이 발생합니다. – thefellow3j

답변

10

Do는 실행될 때 몇 가지 부작용이 발생하도록 지정하고 부작용이있는 시퀀스를 반환합니다.

Run은 시퀀스를 열거하고 void를 반환합니다.

이렇게 생각하십시오. 부작용으로 시퀀스를 "태그 지정"하십시오. 이러한 부작용은 시퀀스가 ​​열거 된 경우에만 발생합니다. Do는 부작용이있는 새 시퀀스를 반환합니다.

// Example of .Do 
var elements = new[] { 1, 2, 3 }; 
var elementsWithSideEffects = elements.Do(e => MessageBox.Show(e)); // No Message Boxes shown yet! 
elementsWithSideEffects.Run(); // 3 message boxes shown 

실행, 다른 한편으로는, 순서 열거 : 실행을(), 또는 선택적으로 부작용을 첨부, 다음 순서를 열거 : 실행 (작업을)

// Example of .Run with its own side effects: 
var elements = new[] { 1, 2, 3 }; 
elements.Run(e => MessageBox.Show(e)); // 3 Message Boxes shown. 
+2

배열 선언 다음에 AsObservable()이 필요하다고 생각합니다 (그렇지 않으면'IEnumerable'에서 실행 중입니다). –

+0

Erm, 실수가 아니라면 .Do와 .Run은 IEnumerable 에서 작동하는 IX (Interactive Extensions)의 일부입니다. –

+0

Do는 여전히 IEnumerable과 IObservable 모두에 있습니다. 'Run' *은 WP7 릴리스 타임 프레임에서 양쪽 모두에 있었지만 이제는 Ix의 일부로 만 사용할 수 있습니다. 그런 말로하면, 이제 OP가 참으로 IEnumerable을 가리키며 IObservable이 아니라는 것을 알게되었습니다. 혼란에 사과드립니다. –

8

당신은으로 Do 생각할 수 "Peek"는 각 값/오류/완료에 대한 부작용을 실행하지만 람다가 모두 반환 된 이후 값을 변경할 수 없으므로 사용합니다. Subscribe과 비슷하지만, IObservable<T>을 반환하기 때문에 모나드 ("체인")를 깨뜨리지 않습니다. Do은 종종 로깅에 사용됩니다.

Run은 기본적으로 차단 버전 인 Subscribe입니다. 즉, OnComplete/OnError가 호출 될 때까지 실행이 그 행을지나 계속되지 않음을 의미합니다.

+0

화려한 대답, 이것은 나를 위해 페니 드롭했다. – Contango

6

Do a an Amp meter : 회로 (쿼리 연산자 체인)를 잘라내어 현재 (쿼리 연산자를 통해 흐르는 값)에 대한 미터 (작업 대리자)를 연결합니다. 회로 (질의)를 통해 흐르는 모든 전자 (값)에 대해, 미터 (동작)는 일부 작업을 수행합니다. 회로 (쿼리)의 전원이 여전히 꺼져 있습니다 (게으른). 전류 (값)가 흐르는 배터리를 연결 (foreach 루프를 실행) 할 때까지는 아닙니다. 회로를 켜는 간단한 방법 (쿼리 실행)은 배터리 (ForEach 연산자)를 사용하는 것입니다.

+0

나는 비유를 좋아하지만 ForEach는 배터리가 아닌 부하이다.) 회로가 열리기 전까지는 아무 일도 일어나지 않는다. –

3

Do는 Select 또는 Where와 같은 다른 LINQ 연산자와 같은 역할을합니다. 사용하는 경우 아무 일도 발생하지 않으므로 foreach 일이 발생해야합니다. 실행/ForEach/Subscribe는 foreach 문과 같이 동작하며 즉시 실행됩니다.

각 경우를 사용할 때 100 % 명확하지 않으면 Do를하지 않고 ForEach/Run을 사용하십시오.

관련 문제