1

Reactive Extensionsを学び始めたところです。そして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));
4

1 に答える 1

1

問題を再現できないので、一般的なアドバイスをいくつか提供します。

  • コントロールが初期化される前に、コントロールのイベントをサブスクライブするべきではありません。InitializeComponent();コンストラクターの最初の行である必要があります。そうでない場合は、7種類の奇妙さがあります。

  • InvalidProgramException接続されたデバッガーが動作しているときに発生することがあります。の代わりにTraceまたはを使用することを検討してください。ConsoleDebug

  • そして最も重要なのは、プロジェクトの参照を確認することです。.Net 4.0および4.5は、2つの異なるバージョンのRxを使用します。Nugetを介してRxを参照した場合、ターゲットフレームワークを変更しても、Rx参照は変更されません。新しいRxはポータブルライブラリ/プラットフォームエンライトメント/コンポジションを使用するため、プロジェクトがすべての正しいアセンブリを参照するように注意する必要があります。

于 2012-12-02T19:50:09.427 に答える