Observable.Subscribe在.net 4.5上的InvalidProgramException失败

时间:2012-12-02 18:24:07

标签: c# .net system.reactive .net-4.5

我刚开始学习Reactive Extensions。当我尝试订阅我从事件中获得的observable时,我得到了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 个答案:

答案 0 :(得分:1)

我无法重现这个问题,所以我只提供一些一般性建议:

  • 在初始化控件之前,您可能不应该订阅控件上的事件。 InitializeComponent();应该始终是构造函数中的第一行,或者应该有七种奇怪。

  • 当附加的调试器正在执行时,有时会遇到
  • InvalidProgramException。请考虑使用TraceConsole代替Debug

  • 最重要的是,检查项目参考。 .Net 4.0和4.5使用两个不同版本的Rx。如果您通过Nuget引用了Rx,则更改目标框架将不会更改Rx引用,afaik。较新的Rx使用可移植库/平台启发/组合,因此您应该小心确保项目引用所有正确的程序集。