ReactiveUI消息总线

3

我正在测试ReactiveUI,它看起来非常不错。

然而,我对MessageBus有点困惑。

示例代码:

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

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

在调用Assert语句时,它确实起作用,但在标准WPF应用程序中,结果值从未更新。这可能是由于Scheduler实现的原因,但我还不太清楚。

欢迎任何提示。

1个回答

9

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

如果您改为执行以下操作:

var bus = new MessageBus();

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

如果没有看到消息框,那么肯定是个bug!

为什么要延迟MessageBus?这样做可以更轻松地编写异步代码,因为您现在可以从其他线程发送SendMessage而不会看到WPF的可怕InvalidOperationException,因为访问了错误线程上的对象。


在这种情况下,发送的bus应该和监听的bus是否相同?在你的示例代码中,它们是相同的。这样会引入另一个全局变量吗? - Felix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接