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で動作するのか分かりませんが、最後にはありません。

[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

実際には、2番目のコードのAssertもヒットしていない。私はそれにブレークポイントを入れて、それは起こっていません。 – JustinM

+0

ああ、私は混乱しています。私の元のテストコードは失敗します。しかし、私のテストの2行目が 'Subject obs = new Subject ();'であれば、それを 'Subscribe(obs)'に変更してテストをパスするだけでなく、テストは決してキャッチブロックに入ることはありません。私はそこにブレークポイントを置き、それはヒットしていません。 – JustinM

関連する問題