2011-04-28 47 views
3

我测试ReactiveUI,它看起来很不错。ReactiveUI messagebus

但是,我对MessageBus有些困惑。

示例代码:

var bus = new MessageBus(); 
int result = -1; 

bus.Listen<int>().Subscribe(x => result = x); 
bus.SendMessage(42); 

调用一个断言语句时,但在一个标准的WPF应用程序的结果值永远不会更新它的工作。这可能是由于调度程序的实现,但目前尚不清楚。

任何提示是值得欢迎的。

回答

9

结果是最终更新(与调用Dispatcher.BeginInvoke相同),不是立即。默认情况下,RxUI在单元测试运行器中以不同的方式安排事情,以便更容易编写单元测试 - 这就是为什么您在单元测试运行器输出中看到警告的原因。

如果你是不是做这样的事情:

var bus = new MessageBus(); 

bus.Listen<int>().Subscribe(x => MessageBox.Show("The answer is " + x)); 
bus.SendMessage(42); 

您将看到消息框(如果没有,这绝对是一个错误!)。

为什么MessageBus被推迟?它使编写异步代码变得更容易,因为现在可以从其他线程发送SendMessage,而不会看到WPF的可怕InvalidOperationException,因为访问错误线程上的对象。

+0

谢谢,它是有道理的。 – fabien 2011-04-29 08:24:53

+0

这种情况下,用于发送的'bus'应该与用于监听的'bus'相同吗?在你的示例代码中,它们是相同的。这会引入另一个全局变量吗? – Felix 2018-02-23 02:58:47