首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.reactive跨线程操作的荒谬性

System.reactive跨线程操作的荒谬性
EN

Stack Overflow用户
提问于 2014-09-04 12:15:10
回答 2查看 255关注 0票数 1

我试图获得一个非常简单的示例,将订阅的序列输出到文本框中,就像在控制台应用程序中这样做没有问题一样。

我已经尝试了十几种不同的调用,它们都抛出了相同的交叉线程。

我读到ObserveOnDispatcher可能会做这份工作?但我哪儿也找不到。我尝试过ObserveOn,正如您在下面的代码中看到的那样,但是同样的问题。

代码语言:javascript
复制
private void button1_Click(object sender, EventArgs e)
{
    var source = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)).Timestamp();

    source.ObserveOn(Scheduler.CurrentThread).Subscribe(x => textBox1.AppendText(x.Value.ToString()));
}

我不明白为什么下面的工作很好;

代码语言:javascript
复制
source.Subscribe(x => MessageBox.Show(x.Value + " - " + x.Timestamp));

然而,将这些值写入文本框需要发脾气。

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-04 12:35:12

根据MSDN论坛上的this answer,使用CurrentThread调度程序

..。并不意味着在其上创建查询的线程,而是表示正在执行查询的当前线程。在这方面,它类似于即时调度程序。不同之处在于,CurrentThread调度程序对所有调度操作使用一个队列来支持单线程协作多任务处理,而即时调度程序则会立即执行调度操作,而不管先前计划的操作是否仍在执行。

如果您使用WPF或Windows:ObserveOnDispatcherObserveOn,可以在UI线程上进行观察。

票数 5
EN

Stack Overflow用户

发布于 2014-09-04 18:58:49

将调度器传递到Observable.Timer

代码语言:javascript
复制
var source = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), DispatcherScheduler.Current).Timestamp();

默认情况下,Observable.Timer使用任务池。通常,如果运算符允许您指定调度程序,则应该这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25665257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档