我试图获得一个非常简单的示例,将订阅的序列输出到文本框中,就像在控制台应用程序中这样做没有问题一样。
我已经尝试了十几种不同的调用,它们都抛出了相同的交叉线程。
我读到ObserveOnDispatcher可能会做这份工作?但我哪儿也找不到。我尝试过ObserveOn,正如您在下面的代码中看到的那样,但是同样的问题。
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()));
}我不明白为什么下面的工作很好;
source.Subscribe(x => MessageBox.Show(x.Value + " - " + x.Timestamp));然而,将这些值写入文本框需要发脾气。
有什么想法吗?
发布于 2014-09-04 12:35:12
根据MSDN论坛上的this answer,使用CurrentThread调度程序
..。并不意味着在其上创建查询的线程,而是表示正在执行查询的当前线程。在这方面,它类似于即时调度程序。不同之处在于,CurrentThread调度程序对所有调度操作使用一个队列来支持单线程协作多任务处理,而即时调度程序则会立即执行调度操作,而不管先前计划的操作是否仍在执行。
如果您使用WPF或Windows:ObserveOnDispatcher和ObserveOn,可以在UI线程上进行观察。
发布于 2014-09-04 18:58:49
将调度器传递到Observable.Timer中
var source = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1), DispatcherScheduler.Current).Timestamp();默认情况下,Observable.Timer使用任务池。通常,如果运算符允许您指定调度程序,则应该这样做。
https://stackoverflow.com/questions/25665257
复制相似问题