2012-12-02 85 views
1

我剛開始學習Reactive Extensions。當我嘗試訂閱我從事件中獲得的觀察值時,我得到了InvalidProgramException。下面是完整的代碼:Observable.Subscribe在.NET 4.5上的InvalidProgramException失敗

public MainWindow() 
{ 
    var observable = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
           h => this.MouseMove += h, h => this.MouseMove -= h); 
    observable.Subscribe(x => Debug.WriteLine("hello")); 
    InitializeComponent(); 
} 

異常詳細信息:

InvalidProgramException: "Common Language Runtime detected an invalid program." 
    at System.Reactive.Concurrency.CurrentThreadScheduler.Schedule[TState](TState state, TimeSpan dueTime, Func`3 action) 
    at System.Reactive.Concurrency.LocalScheduler.Schedule[TState](TState state, Func`3 action) 
    at System.Reactive.Producer`1.SubscribeRaw(IObserver`1 observer, Boolean enableSafeguard) 
    at System.Reactive.Producer`1.Subscribe(IObserver`1 observer) 
    at System.ObservableExtensions.Subscribe[T](IObservable`1 source, Action`1 onNext) 
    at FunWithReactiveUI.MainWindow..ctor() in c:\... 

所以我做錯了嗎?有什麼建議麼?謝謝。

我使用Rx 2.0.21114,.Net Framework 4.5。在4.0上它工作正常。

編輯:

我也有這個簡單的代碼相同的異常。 Subscribe在調試模式下在.net 4.5上失敗。

Observable.Return(1).Subscribe(x => Console.WriteLine(x)); 

回答

1

我無法重現的問題,所以我就提供一些一般性的建議:

  • 你可能不應該訂閱事件上的控件在初始化之前。 InitializeComponent();應始終是構造函數中的第一行,否則應該有七種奇怪。

  • InvalidProgramException有時會在連接的調試器動作時遇到。考慮使用TraceConsole而不是Debug

  • 而最重要的是,請檢查項目參考。 .Net 4.0和4.5使用兩個不同版本的Rx。如果您通過Nuget引用Rx,那麼更改目標框架將不會更改Rx引用afaik。較新的Rx使用便攜式庫/平臺啓示/組合,因此您應該小心確保項目引用所有正確的程序集。

+0

那麼,沒有調試它工作正常,謝謝。 – 2kay

+0

@ 2kay雖然它處於魔法領域,但有時候乾淨/重建/重新啓動也有訣竅。 – Asti

相關問題