2013-11-22 18 views
0

我繼承了Silverlight 5應用程序。在服務器端,它有一個DomainContext(服務)與標記爲使用Invoke調用WCF RIA Service方法時,返回類型是否會影響完成回調的執行?

[Invoke] 
public void DoIt 
{ 
do stuff for 10 seconds here 
} 

在客戶端的方法,它具有含該一個ViewModel方法:

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

我的2個問題是

1)已DoIt已經由附上q.Completed的時間激活,並且

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; 
    } 
}