gpt4 book ai didi

c# - 了解从非阻塞 block 调用阻塞代码时的控制流?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:01 25 4
gpt4 key购买 nike

我有以下代码

 static void Main(string[] args)
{
//var source = BlockingMethod();
var source2 = NonBlocking();
source2.Subscribe(Console.WriteLine);
//source.Subscribe(Console.WriteLine);
Console.ReadLine();

}
private static IObservable<string> BlockingMethod()
{
var subject = new ReplaySubject<string>();
subject.OnNext("a");
subject.OnNext("b");
subject.OnCompleted();
Thread.Sleep(1000);
return subject;
}
private static IObservable<string> NonBlocking()
{
return Observable.Create<string>(
observable =>
{
observable.OnNext("c");
observable.OnNext("d");
observable.OnCompleted();
//Thread.Sleep(1000);

var source = BlockingMethod();
source.Subscribe(Console.WriteLine);

return Disposable.Create(() => Console.WriteLine("Observer has unsubscribed"));
//or can return an Action like
//return () => Console.WriteLine("Observer has unsubscribed");
});
}
}

打印

c
d
Observer has unsubscribed
a
b

谁能帮我搞定程序中的控制流程。我确实尝试阅读调用堆栈等..但无法理解所有内容。

编辑为什么我得到上面的输出(我认为是正确的)而不是

 c 
d
a
b
Observer has unsubscribed

最佳答案

您的预期行为与实际行为的差异来自以下行:

var subject = new ReplaySubject<string>();

默认情况下,ReplaySubject 使用 Scheduler.CurrentThread。就好像你这样声明它:

var subject = new ReplaySubject<string>(Scheduler.CurrentThread);

当使用当前线程进行调度时,您的操作会排队 - 等待当前执行的代码在开始之前完成。如果您希望代码立即运行,您需要像这样使用 Scheduler.Immediate:

var subject = new ReplaySubject<string>(Scheduler.Immediate);

这是否足以解释它?

关于c# - 了解从非阻塞 block 调用阻塞代码时的控制流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8955652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com