2013-11-22 7 views
0

Silverlight 5 응용 프로그램을 상속 받았습니다.Invoke를 사용하여 WCF RIA Service 메서드를 호출 할 때 Completed 콜백이 실행될 때 반환 형식이 영향을 줍니까?

var q = Context.DoIt(0); 
var x=1; var y=2; 
q.Completed += (a,b) => DoMore(x,y); 

내이 개 질문은

: 서버 측에서, 그것은

클라이언트 측에
[Invoke] 
public void DoIt 
{ 
do stuff for 10 seconds here 
} 

로 표시하는 방법으로 DomainContext (서비스)를 가지고,이 포함 된 뷰 모델 방법이있다

DoIt 이미 저는 q.Completed 부착 시간에 의해 활성화 된 1)

2)는 타이밍으로 복귀 형 (공극) 입력을 수행 뭐야?

는 지금, 나는 즉 DoIt를 호출하는 또 다른 방법이 알고 :이 전화를 만드는 방법은 두 가지가 상호 배타적 인 생각하는 날 리드

var q = Context.DoIt(0,myCallback); 

.

답변

1

DoIt()은 원격 컴퓨터에서 실행되지만 Completed 이벤트 처리기를 즉시 연결하는 것이 가장 좋습니다. 그렇지 않으면 프로세스가 완료되면 콜백을 놓칠 수 있습니다.

정확합니다. DoIt을 호출하는 두 가지 방법은 상호 배타적입니다.

복잡한 논리가있는 경우 Bcl 비동기 라이브러리를 사용하는 것이 좋습니다. 이 blog post을 참조하십시오. 비동기 사용

, 코드는 다음과 같이 표시됩니다

// Note: you will need the OperationExtensions helper 
public async void CallDoItAndDosomething() 
{ 
    this.BusyIndicator.IsBusy = true; 
    await context.DoIt(0).AsTask(); 
    this.BusyIndicator.IsBusy = false; 
} 

public static class OperationExtensions 
{ 
    public static Task<T> AsTask<T>(this T operation) 
    where T : OperationBase 
    { 
    TaskCompletionSource<T> tcs = 
     new TaskCompletionSource<T>(operation.UserState); 

    operation.Completed += (sender, e) => 
    { 
     if (operation.HasError && !operation.IsErrorHandled) 
     { 
     tcs.TrySetException(operation.Error); 
     operation.MarkErrorAsHandled(); 
     } 
     else if (operation.IsCanceled) 
     { 
     tcs.TrySetCanceled(); 
     } 
     else 
     { 
     tcs.TrySetResult(operation); 
     } 
    }; 

    return tcs.Task; 
    } 
}