2015-01-16 41 views
1

我有一個IQStreamable對象,其使用DefineObservableMicrosoft.ComplexEventProcessing.ApplicationStreamInsight:僅當在Task.Run()塊中傳遞X時,才能序列化X類型的值。

該代碼看起來很正常,但我不明白的是,當我使用從Task.Run()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 serialze觀察者對象?爲什麼?

  2. 什麼是

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

之間的不同,這 DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)

爲什麼使用arugument引起該問題?

回答

0
  1. 是的,但我仍然不知道原來的設計和原因。
  2. 對於此調用:.DefineObservable<Price>(() => PriceObservable)。這意味着參數在應用程序內存中。參數需要被序列化以傳遞給遠程服務器。因此,在此之後,參數實際上在StreamInsight服務器內存中。由於它是接口類型,所以參數不能被序列化。

爲此致電:DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable),我的猜測,這被認爲是一個委託調用,所以Instance.PriceObservable尚未實例化,直到的StreamInsight服務器調用的代碼。發生這種情況時,所有內容都在StreamInsight服務器內存中。所以不需要序列化。

總之,序列化不會發生第二次調用。

我接受更正。

相關問題