2011-04-28 101 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