1

を使用しIQStreamableて作成されたオブジェクトがあります。DefineObservableMicrosoft.ComplexEventProcessing.Application

Task.Run()コードは正常に見えますが、渡された引数 from intoを使用するDefineObservableと、例外が発生することがわかりません。

ただし、プロパティを内部のメソッドに渡さずに直接使用するとTask.Run()、機能しました。

例外

An unhandled exception of type 'System.InvalidOperationException' occurred in Microsoft.ComplexEventProcessing.Diagnostics.dll

Additional information: Cannot serialize value of type 'System.IObservable'1[ValueObjects.Price]'.

メソッド

private void Monitor(IObservable<Price> priceObservable)
    {
        const string applicationName = "RealtimeMonitoring";

        Microsoft.ComplexEventProcessing.Application application = PriceObserver.Server.CreateApplication(applicationName);
        IQStreamable<Price> sStreamable = application
            //.DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)
            .DefineObservable<Price>(() => PriceObservable)
            .ToPointStreamable( => PointEvent<Price>.CreateInsert(DateTime.Now, price), AdvanceTimeSettings.IncreasingStartTime);

        var standingQuery = from p in streamable select price ;
        var sink = application.DefineObserver(() => new PriceObserver());

        using (standingQuery.Bind(sink).Run())
        {
            // some code...
        }
    }

呼び出し:

Task.Run(()=>Monitor(PriceRealtimeProvider.Instance.PriceObservable)

質問:

  1. StreamInsight はオブザーバー オブジェクトをシリアル化しますか? なぜ?

  2. 違いは何ですか

これ .DefineObservable<Price>(() => PriceObservable)

これ DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)

引数を使用すると問題が発生するのはなぜですか?

4

1 に答える 1

0
  1. はい、でも元のデザインとその理由はまだわかりません。
  2. この呼び出しの場合: .DefineObservable<Price>(() => PriceObservable). これは、引数がアプリケーション メモリ内にあることを意味します。また、引数をシリアル化してリモート サーバーに渡す必要があります。したがって、この後、引数は実際には StreamInsight サーバーのメモリにあります。また、引数はインターフェイスのタイプであるため、シリアル化できません。

この呼び出しの場合:DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)私の推測では、これはデリゲート呼び出しと見なされるため、Instance.PriceObservableStreamInsight サーバーがコードを呼び出すまで、 はまだインスタンス化されません。これが発生すると、すべてが StreamInsight サーバーのメモリに格納されます。したがって、シリアル化の必要はありません。

つまり、2 番目の呼び出しではシリアル化は行われません。

私は修正のために開いています。

于 2015-02-06T08:11:29.960 に答える