WCF、sliverlight非同步返回分析

張國平發表於2010-03-11

 

我現在開發的東西,使用WCF和sliverlght配合,其中WCF提供服務,sliverlight做前段顯示,碰到很多sliverlight應用返回的問題。其中一個是迴圈,一個是等待阻塞

OK,

按照這個為例子:

通常呼叫返回值的方法是呼叫e.Result,呼叫方法是

 {    client.GetRandomAsync(100); 
     client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted); 

 
void client_GetRandomCompleted(object sender, WCFTest.DataServiceRef.GetRandomCompletedEventArgs e)  
 {  
     this.txtData.Text = "The return data is "+e.Result.ToString(); 
}

其中GetRandomAsync(100);可以視為給wcf傳送資訊,啟動GetRandom事件。

而  client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted);是說明當GetRandom完成後,觸發client_GetRandomCompleted事件。

而,WCFTest.DataServiceRef.GetRandomCompletedEventArgs包含返回值,就是e.Result。這樣在觸發中處理返回值。

不過這樣要寫新的方法,而且很多方法內的變數要變成全域性變數才可以傳值,尤其是在用多個返回值的時候,大大增加麻煩。一種更靈活的返回值處理方法是

{

 client.getRandomAsync(i);

                client.getRandomCompleted += (sender2, e2) =>
                {
                
                        this.rumun.Text = e2.Result + "";
                        da += e2.Result;
                   
                                       
                };

}

這個是一個簡單的方法,其中sender2, e2,分別是觸發和返回,可以直接在後面進行處理,簡單很多。

OK,我常常會有一個問題,就是等待返回值阻塞的問題,比如我要從WCF裡面獲得返回值,再進行下一步操作。

比較麻煩的方法是,把下一步操作放在完成觸發的方法裡面,比如

 {    client.GetRandomAsync(100); 
     client.GetRandomCompleted += new EventHandler(client_GetRandomCompleted); 

 
void client_GetRandomCompleted(object sender, WCFTest.DataServiceRef.GetRandomCompletedEventArgs e)  
 {  

//這個txt顯示事件就放在觸發方法裡面
     this.txtData.Text = "The return data is "+e.Result.ToString(); 


}

如果要等待的時間太多了,或者邏輯情況很麻煩的話,就頭大了。比如這個情況

      {          client.getRandomAsync(6);
       
                client.getRandomCompleted += new EventHandler(client_getRandomCompleted);
    
          
            MessageBox.Show(da.ToString());
        }
      
        void client_getRandomCompleted(object sender, getRandomCompletedEventArgs e)
        {
            da += e.Result;
            MessageBox.Show(da.ToString());
                    }

就會出現兩個不同的結果,一個是0,一個是後來的WCF的返回值。

解決這個問題,一個是改變程式設計,還有就是用AsyncCallback parameter and wrappers for Begin / End.

這個後面再說

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22259926/viewspace-629273/,如需轉載,請註明出處,否則將追究法律責任。

相關文章