2011-02-23 1 views
1

Silverlight 4의 Observables를 사용하여 WCF 호출을하는 데 질문이 있습니다. 아래의 간단한 webservice 호출을 고려하십시오.silverlight, Observables on WCF calls를 사용하여 IEvent 캐스팅 T : AsyncCompletedEventArgs

var adminclient = ServiceProxy.WithFactory<AuthenticationClient>(); 
var results= Observable.FromEvent<AuthorizeAdministratorCompletedEventArgs>(
    s => adminclient.AuthorizeAdministratorCompleted += s, 
    s => adminclient.AuthorizeAdministratorCompleted -= s).ObserveOnDispatcher(); 

adminclient.AuthorizeAdministratorAsync(); 
results.Subscribe(e => 
{ 
    //Enable UI Button 
}); 

나는 그것을 반환에 일부 오류 검증을 수행의 가입 방법을 감싸는 확장 방법을 구현했습니다. 반환 results.Subscribe에


(예 =>

e is System.Collections.Generic.Event<AuthorizeAdministratorCompletedEventArgs> 

거의 모든 쿼리는 다른 리턴 타입과 같은 것이다 : 나는 래퍼가 있다면

e is System.Collections.Generic.Event<AsyncCompletedEventArgs> 

을 어떻게 든 이런 식으로 보였습니다. 모든 유형의 캐스팅은 어떻게 할 수 있습니까 xxxCompletedEventArgs베이스 유형 AsyncCompletedEventArgs 내가 e.EventArgs에 액세스하고 오류를 위의 코드는 유형의 객체 'System.Collections.Generic.Event 1 MyProject.Provider.AuthorizeAdministratorCompletedEventArgs을 캐스팅 할 수

가 없습니다 실패합니다

public static IDisposable Subscribe<TSource>(this IObservable<TSource> source, Action<TSource> onNext = null, Action onError = null, Action onFinal = null) 
{ 
    Action<TSource> onNextWrapper = (s) => 
    {     
    var args = (System.Collections.Generic.IEvent<AsyncCompletedEventArgs>)s; 

    try 
     {        
      if (WCFExceptionHandler.HandleError(args.EventArgs)) 
      { 
       if (onNext != null) 
        onNext(s); 
      } 
      else 
      { 
       if (onError != null) 
        onError(); 
      } 
     } 
     finally 
     { 
      if (onFinal != null) 
       onFinal(); 
     } 
    }; 

    return source.Subscribe<TSource>(onNextWrapper, (e) => { throw e; }); 
} 

속성을 검사 할 수 있도록 ] 'to type'System.Collections.Generic.IEvent 1[System.ComponentModel.AsyncCompletedEventArgs]'

이 메서드 정의는 입니다. WCFExceptionHandler 는 수신 확장 메서드의 대부분만큼 같은 비 차단 연산자 (같은 이벤트를 처리하는 역할을하도록 .HandleError (args.EventArgs는))

public static bool HandleError(AsyncCompletedEventArgs e) 

답변

3

나는 아마 확장 방법을 변경할 것 연산자). 뭔가 같이 :

public static IObservable<IEvent<TEventArgs>> GetHandledEvents<TEventArgs>(this IObservable<IEvent<TEventArgs>> source) 
    where TEventArgs : AsyncCompletedEventArgs 
{ 
    return Observable.CreateWithDisposable<IEvent<TEventArgs>>(observer => 
     { 
      return source.Subscribe(evt => 
       { 
        try 
        { 
         if (WCFExceptionHandler.HandleError(evt.EventArgs)) 
         { 
          observer.OnNext(evt); 
         } 
         else 
         { 
          observer.OnError(new Exception("Some Exception")); 
         } 
        } 
        finally 
        { 
         observer.OnError(new Exception("Some Other Exception")); 
        } 
       }, 
       observer.OnError, 
       observer.OnCompleted); 
     }); 
} 

그 다음을 통해 호출

results.GetHandledEvents() 
    .Finally(() => DoSomethingFinally()) 
    .Subscribe(e => 
    { 
    //Enable UI Button 
    }, 
    ex => HandleException(ex), 
() => HandleComplete()); 

내가 이벤트가 원래의 유형으로 통해 깔때기 것으로이이 문제를 해결해야한다고 생각 그것은 HandleError 이벤트 인수를 얻을 수 있다는 것을 보장 올바른 유형입니다.

+0

매우 자세히 답변 해 주셔서 감사합니다.하지만 "observer.OnNext (evt);" 컴파일되지 않습니다. 가장 오버로드 된 메서드가 'System.IObserver >와 일치합니다. OnNext (System.Collections.Generic.IEvent ) 일부 잘못된 인수 – Neil

+1

@Neil - 죄송합니다, Observable.CreateWithDisposable >가 Observable 일 필요가 있습니다 .CreateWithDisposable >. 내 예를 업데이트했습니다. 그거 좋았어? –

+0

그래, 또한 알아 냈어, 고마워, 마지막 문제는 내 마지막 진술에 "observer.OnCompleted();"가 포함되어 있지만 "adminclient.AuthorizeAdministratorAsync();" 두 번, 두 개의 다른 매개 변수를 사용하면 OnNext 만 실행되고 두 번째 매개 변수는 이벤트 처리기가 표시되지 않습니다.모든 제안 } – Neil

관련 문제