本文介绍了为什么不是 Observable.Finally 被调用?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我不理解Finally 方法.在这种情况下它不会触发.
I'm not understanding the Finally method. It doesn't fire in this situation.
[TestMethod]
public void FinallyHappensOnError()
{
bool finallyActionHappened = false;
try
{
Observable
.Throw<Unit>(new DivideByZeroException())
.Finally(() => finallyActionHappened = true)
.Subscribe();
}
catch
{
}
Assert.IsTrue(finallyActionHappened);
}
这个使用 Do 而不是 finally 来工作.我不明白为什么它适用于 Do 而不是最终.
This one works using Do rather than Finally. I don't understand why it works with Do but not Finally.
[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);
}
推荐答案
你的代码(双向)是一个竞争条件.竞争条件用 .Do
解决正确的方法,用 .Finally
解决错误的方法.为什么比如何避免它更不重要:
Your code (both ways) is a race condition. The race condition resolves the right way with .Do
and the wrong way with .Finally
. Why is less relevant than how to avoid it:
public async Task FinallyHappensOnError()
{
bool finallyActionHappened = false;
try
{
await Observable.Throw<Unit>(new DivideByZeroException())
.Finally(() => finallyActionHappened = true);
}
catch
{
}
Assert.IsTrue(finallyActionHappened);
}
或者,如果您不想使用 TPL/async/await:
or, if you don't want to use TPL/async/await:
[TestMethod]
public void FinallyHappensOnError()
{
bool finallyActionHappened = false;
try
{
Observable
.Throw<Unit>(new DivideByZeroException())
.Finally(() => finallyActionHappened = true)
.Subscribe(
_ => {},
() => Assert.IsTrue(finallyActionHappened)
);
}
catch
{
}
}
这篇关于为什么不是 Observable.Finally 被调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!