system.reactive - 使用 2nd SubscribeOn 时 Rx.net 行为发生变化(可能违反隐式反应式合同)
问题描述
当我取消注释第二个订阅时,我试图了解不断变化的行为。
在这种情况下,我点击了抛出异常的行。
有人可以为我提供答案 - 如果这是预期的行为,为什么?
如果没有第二次订阅,则需要 30 多秒才能完成(这很好)。使用 - 它在运行 2 秒后出现异常情况。
[TestMethod]
public void AsyncObservable_NonReentrant()
{
int tester = 0;
bool finished = false;
Observable.Generate(
0,
i => i < 5,
i => i+1,
i => i,
_ => TimeSpan.FromSeconds(1)
)
.SubscribeOn(ThreadPoolScheduler.Instance)
.Finally(()=>finished = true)
.Select(_ =>
{
Interlocked.Increment(ref tester);
if (tester > 1)
throw new InvalidOperationException();
return Observable
.Repeat(1, 5)
.Window(3)
.Finally(()=>Interlocked.Decrement(ref tester))
/*.SubscribeOn(ThreadPoolScheduler.Instance)*/;
})
.Concat()
.Subscribe(__ =>
{
Thread.Sleep(3000);
});
while (!finished)
Thread.Sleep(100);
}
解决方案
推荐阅读
- ios - Swift iOS将字符串“Hello”屏蔽为“Hxxxo”
- typescript - 如果不允许调用者,则在 TypeScript 中阻止方法调用
- excel - 编辑表功能只能以不可预知的方式工作
- java - 获取 NullPointerException 但打印对象返回内存引用和空值
- python - 执行 PCA 并了解保留了哪些列
- html - 有两个
- c++ - 为什么动态链接器*减去*虚拟地址以找出加载的共享库可执行文件在内存中的位置?
- sql - PL SQL 过程的打印标题
- regex - power shell 如何将 \n 视为文字 regunescape
- java - 我在 Android 4 手机上遇到的崩溃