Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ReplaySubject.First()意外阻塞_C#_.net_Multithreading_System.reactive - Fatal编程技术网

C# ReplaySubject.First()意外阻塞

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

在我正在开发的Silverlight应用程序中,我遇到了一个非常奇怪的行为。请参阅以下代码:

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”来拼写。希望你不介意,没问题!没有拼写规则,我只是想让问题更正式一些。我希望我没有给你带来任何不便。祝你今天愉快:)