2015-01-16 2 views
1

DefineObservableMicrosoft.ComplexEventProcessing.Application을 사용하여 생성 된 IQStreamable 개체가 있습니다.StreamInsight : X가 Task.Run() 블록에 전달 된 경우에만 X 유형의 값을 serialize 할 수 없습니다.

코드는 정상적으로 보이지만, 내가 이해할 수없는 것은 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) 

질문 :합니까 StreamInsight는 관찰자 객체를 serialze

  1. ? 그리고 왜?

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

사이의 차이가 무엇

  • DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)

    arugument이 문제를 일으키는 사용하는 이유는 무엇입니까?

  • 답변

    0
    1. 예,하지만 여전히 원래 디자인과 이유를 알지 못합니다.
    2. 이 전화의 경우 : .DefineObservable<Price>(() => PriceObservable). 이것은 인수가 응용 프로그램 메모리에 있음을 의미합니다. 그리고 인수는 원격 서버로 전달되도록 직렬화되어야합니다. 따라서이 인수는 실제로 StreamInsight 서버 메모리에 있습니다. 그리고 인터페이스의 유형이기 때문에 인수를 직렬화 할 수 없습니다. 이 호출에 대한

    : DefineObservable<Price>(() => PriceRealtimeProvider.Instance.PriceObservable)은, 내 생각 엔,이는 대리자 호출로 간주되므로은 StreamInsight 서버 코드를 호출 할 때까지 Instance.PriceObservable 아직 인스턴스화되지 않습니다. 이러한 상황이 발생하면 모든 것이 StreamInsight 서버 메모리에 저장됩니다. 직렬화가 필요 없습니다.

    두 번째 호출에서 직렬화가 발생하지 않습니다.

    나는 열어 두었습니다.