gpt4 book ai didi

.net - SubscribeOn 和 ObserveOn 有什么区别

转载 作者:行者123 更新时间:2023-12-03 03:22:13 30 4
gpt4 key购买 nike

我刚刚发现了 SubscribeOn,这让我想知道我是否应该使用它而不是 ObserveOn。谷歌带了我herehere ,但两者都没有帮助我理解差异:它看起来非常微妙。

(在我的上下文中,我在非 GUI 线程上“出现”了事件,并且在使用事件数据更新控件之前我需要切换到 GUI 线程)。

最佳答案

通过将 SubscribeOn 视为将线程设置为在链中“向上传递”,并将 ObserveOn 视为设置线程在链中“向下传递”,它帮助我理解了这一点。

Subscriber thread "passed up" and Observer thread "passed down"

下面的代码使用了您可以使用的命名线程。

Thread.CurrentThread.Name = "Main";

IScheduler thread1 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread1" });
IScheduler thread2 = new NewThreadScheduler(x => new Thread(x) { Name = "Thread2" });

Observable.Create<int>(o =>
{
Console.WriteLine("Subscribing on " + Thread.CurrentThread.Name);
o.OnNext(1);
return Disposable.Create(() => {});
})
.SubscribeOn(thread1)
.ObserveOn(thread2)
.Subscribe(x => Console.WriteLine("Observing '" + x + "' on " + Thread.CurrentThread.Name));

上面的输出是:

在线程 1 上订阅
在线程2上观察1

有趣的是,当您注释掉 SubscribeOn 行时,输出为:

在 Main 上订阅
在线程2上观察1

因为默认情况下,订阅会“传递”正在运行的线程(此处为 Main)。然后ObserveOn“向下传递”Thread2

如果您注释掉 ObserveOn 行,则输出为:

在线程 1 上订阅
在线程 1 上观察 1

因为我们“传递”了 Thread1 上的订阅,并且默认情况下,同一线程被“传递”并用于运行观察。

在 GUI 上下文中,为了保持响应,您希望在 GUI 线程上完成最少的工作量,但需要在 GUI 线程上完成订阅(以同步 UI 更新)。所以你想在GUI线程上观察。

关于.net - SubscribeOn 和 ObserveOn 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7579237/

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