C# StreamInsight:只有在Task.Run()块中传递X时,才能序列化类型X的值

C# StreamInsight:只有在Task.Run()块中传递X时,才能序列化类型X的值,c#,serialization,task-parallel-library,streaminsight,C#,Serialization,Task Parallel Library,Streaminsight,我使用Microsoft.ComplexEventProcessing.Application的DefineObservable创建了一个IQStreamable对象 代码看起来正常,但我不明白的是,当我使用Task.Run中传入的参数时,我遇到了一个异常 但是,当我直接使用该属性而不将其传递到Task.Run中的方法时,它起了作用 例外情况 Microsoft.ComplexeventProcess.Diagnostics.dll中发生类型为“System.InvalidOperationEx

我使用Microsoft.ComplexEventProcessing.Application的DefineObservable创建了一个IQStreamable对象

代码看起来正常,但我不明白的是,当我使用Task.Run中传入的参数时,我遇到了一个异常

但是,当我直接使用该属性而不将其传递到Task.Run中的方法时,它起了作用

例外情况

Microsoft.ComplexeventProcess.Diagnostics.dll中发生类型为“System.InvalidOperationException”的未处理异常

其他信息:无法序列化“System.IObservable”1[ValueObjects.Price]类型的值

方法

问题:

StreamInsight是否序列化观察者对象?为什么

两者有什么不同

这个 .DefineObservable=>PriceObservable 及

这个 DefineObservable=>PriceRealtimeProvider.Instance.PriceObservable

为什么使用arugument会导致问题

是的,但我仍然不知道最初的设计和原因。 对于此调用:.DefineObservable=>PriceObservable。这意味着参数在应用程序内存中。参数需要序列化才能传递到远程服务器。因此,在此之后,参数实际上位于StreamInsight服务器内存中。由于参数是接口类型,因此无法序列化该参数。 对于此调用:DefineObservable=>PriceRealtimeProvider.Instance.PriceObservable,我猜,这被视为一个委托调用,因此Instance.PriceObservable尚未实例化,直到StreamInsight server调用代码。发生这种情况时,所有内容都在StreamInsight服务器内存中。所以不需要序列化

总之,第二次调用不会发生序列化

我愿意改正

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)