System.reactive跨线程操作荒谬

use*_*221 1 c# multithreading observablecollection winforms system.reactive

我试图得到一个非常简单的示例,将订阅序列输出到文本框中,因为您可以预期在控制台应用程序中执行它是没有问题的.

我已经尝试了十几种不同的invoke变体,所有这些都会使相同的交叉线程符合他们的要求.

我读过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()));
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以下工作正常;

source.Subscribe(x => MessageBox.Show(x.Value + " - " + x.Timestamp));
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Dir*_*irk 5

根据MSDN论坛上的这个答案使用CurrentThread调度程序

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

如果您使用WPF或Windows窗体,则可以使用专门的方法在UI线程上进行观察:ObserveOnDispatcherObserveOn.