C# ReplaySubject.First()意外阻塞
在我正在开发的Silverlight应用程序中,我遇到了一个非常奇怪的行为。请参阅以下代码:C# ReplaySubject.First()意外阻塞,c#,.net,multithreading,system.reactive,C#,.net,Multithreading,System.reactive,在我正在开发的Silverlight应用程序中,我遇到了一个非常奇怪的行为。请参阅以下代码: var replaySubject = new ReplaySubject<string>(1); replaySubject.OnNext("This can never block... surely?"); var s = replaySubject.First(); Debug.WriteLine(s); var replaySubject=新的replaySubject
var replaySubject = new ReplaySubject<string>(1);
replaySubject.OnNext("This can never block... surely?");
var s = replaySubject.First();
Debug.WriteLine(s);
var replaySubject=新的replaySubject(1);
OnNext(“这永远不会阻止……当然?”);
var s=replaySubject.First();
Debug.WriteLine(s);
基本上,我的应用程序通过这段代码来重复,它总是打印出消息。。。除了在一个特定场景中,线程阻塞在First()
行
它总是在UI线程上。如果我使用First()
在行上设置断点,并使用调试器钻取replaySubject
,我可以在其队列中看到字符串
有人能想到任何会导致First()
调用在此阻塞的场景吗
顺便说一句:这是RX版本1.1.11111从您的代码来看,似乎没有订户注册在这个
可观察的。因此,它可能会等待一个订阅,以便它可以给你第一个可用的
您可以尝试使用FirstOrDefault
来查看它是否为空。确定,因此默认情况下,ReplaySubject
使用调度程序。CurrentThread
如果我显式地将ReplaySubject
设置为使用Scheduler.Immediate
或Scheduler.ThreadPool
,则它会按预期工作
var replaySubject = new ReplaySubject<string>(1, Scheduler.Immediate);
replaySubject.OnNext("This can never block... surely?");
var s = replaySubject.First();
Debug.WriteLine(s);
var replaySubject=新的replaySubject(1,Scheduler.Immediate);
OnNext(“这永远不会阻止……当然?”);
var s=replaySubject.First();
Debug.WriteLine(s);
我仍然需要研究UI线程在我的特定场景中是如何陷入这种混乱的,但现在,这解决了问题
---编辑---
好的,进一步研究发现,上面的代码大部分时间是在线程池线程上启动的。即使在到达代码时,它位于调度程序线程上,Scheduler.CurrentThread也会将ReplaySubject放回原始线程池线程
然而,在它崩溃的场景中,一切都是从用户单击按钮开始的。这显然是在UI线程上,当它到达这段代码时,Scheduler.CurrentThread现在是UI线程,因为我们已经在UI线程上了,所以出现了死锁。第一个是等待ReplaySubject泵送—但是泵在当前操作后面排队。非常微妙,需要注意。谢谢勒内的回复。AFAIK First()设置订阅,接受1,然后关闭订阅。另外,如果你说的是真的,那么上面的代码总是会阻塞——而不是我看到的,它会重复工作,然后突然阻塞。@Picrofo EGY——感谢你为我将代码关键字放入代码块中。然而,我不知道你为什么要把“我是”改成“我是”——是否有一些使用收缩的政策?另外,我是英国人,所以这里的行为用“U”来拼写。希望你不介意,没问题!没有拼写规则,我只是想让问题更正式一些。我希望我没有给你带来任何不便。祝你今天愉快:)