2017-11-10 6 views
2

나는 Finally 메서드를 이해하지 못한다. 이 상황에서는 발사되지 않습니다.왜 관측 가능하지 않습니까? 마지막으로 전화가 왔습니까?

[TestMethod] 
public void FinallyHappensOnError() 
{ 
    bool finallyActionHappened = false; 
    try 
    { 
     Observable 
     .Throw<Unit>(new DivideByZeroException()) 
     .Finally(() => finallyActionHappened = true) 
     .Subscribe(); 
    } 
    catch 
    { 
    } 
    Assert.IsTrue(finallyActionHappened); 
} 

이 방법은 마침내 마침표 대신 마침표를 사용하여 작동합니다. Do not와 함께 작동하는 이유는 모르지만 마침내는 이해할 수 없습니다.

[TestMethod] 
public void CanRecordWhenSequenceFinishes() 
{ 
    bool sequenceFinished = false; 
    try 
    { 
     Observable.Throw<Unit>(new DivideByZeroException()) 
     .Do(
      onError: ex => { sequenceFinished = true; }, 
      onCompleted:() => sequenceFinished = true, 
      onNext: _ => { }) 
     .Subscribe(); 
    } 
    catch 
    { 

    } 
    Assert.IsTrue(sequenceFinished); 
} 

답변

2

코드 (양방향)는 경쟁 조건입니다. 경쟁 조건은 .Do으로 올바른 방법을 해결하고 .Finally으로 잘못된 방법을 해결합니다. 이하 관련이 왜 어떻게 그것을 피하기 위해 : 당신이 사용하지 않는 경우,

public async Task FinallyHappensOnError() 
{ 
    bool finallyActionHappened = false; 
    try 
    { 
     await Observable.Throw<Unit>(new DivideByZeroException()) 
      .Finally(() => finallyActionHappened = true); 
    } 
    catch 
    { 
    } 
    Assert.IsTrue(finallyActionHappened); 

} 

또는 TPL/비동기/await를 : 나는 완전히 이해하지

[TestMethod] 
public void FinallyHappensOnError() 
{ 
    bool finallyActionHappened = false; 
    try 
    { 
     Observable 
     .Throw<Unit>(new DivideByZeroException()) 
     .Finally(() => finallyActionHappened = true) 
     .Subscribe(
      _ => {}, 
      () => Assert.IsTrue(finallyActionHappened) 
     ); 
    } 
    catch 
    { 
    } 

} 
+0

. 무엇과 무엇 사이의 경쟁? 최종 테스트가 끝나기 전에 테스트가 끝났습니까? 지연, 스레드 스케줄러 등이 없기 때문에 이것이 모두 동기식이라고 생각했습니다. – JustinM

+0

실제로 두 번째 코드의 Assert는 적중되지 않습니다. 나는 그것에 브레이크 포인트를 두었고 그것은 일어나지 않았다. – JustinM

+0

오, 나는 혼란 스럽다. 위의 원래 테스트 코드가 실패합니다. 하지만 두 번째 줄의 테스트가'Subject obs = new Subject ();'인 경우 'Subscribe (obs)'로 변경하면 테스트가 통과 될뿐만 아니라 테스트가 Catch 블록에 들어 가지 않습니다. 나는 거기에 브레이크 포인트를 놓고 치는 것이 아니다. – JustinM