1

我刚开始学习Reactive Extensions。当我InvalidProgramException尝试订阅我从事件中获得的 observable 时,我得到了。这是完整的代码:

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));
4

1 回答 1

1

我无法重现该问题,所以我将提供一些一般性建议:

  • 您可能不应该在控件初始化之前订阅它们的事件。InitializeComponent();应该总是在构造函数的第一行,否则会有七种怪异。

  • InvalidProgramException有时会在附加的调试器运行时遇到。考虑使用TraceorConsole代替Debug.

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

于 2012-12-02T19:50:09.427 回答