2010-05-04

WCF- Asynchronous Call

還是一樣開始慢慢練習WCF,首先就先從最常使用的Asynchronous 呼叫來練習。

非同步的呼叫,對設計Client端應用程式來說相當重要,
因為在向Service請求回應時,為了要等待Service回應,
應用程式必須要等待,萬一這段期間需要很長的處理時間,
程式就會停在那,完全無法動作
(這點再設計Client端時需要注意,因為使用者會誤認為當機)

所以,不管是Service或是在Client端執行邏輯時,
我都會將需要花很長時間才能完成的程式,
放在背景執行,並有Progress bar來顯示進度。。。

好了~廢話少說,就先來練習這個小小的課題!
要使用非同步的Method,首先先在[加入服務參考]中
image
選擇[進階]選項->勾選[產生非同步作業]
image 

之後在Client端中,新增一個ServiceClient,
可以在intellisense中找到有Begin開頭與End開頭的Method,
image
程式碼如下:

   1:  SE.Service1Client se = new TestWCF1.SE.Service1Client();
   2:   
   3:  AsyncCallback ac=new AsyncCallback(MyCallBack);
   4:   
   5:  IAsyncResult iarResult = se.BeginGetData(1, ac, "Please wait...........");
   6:   
   7:  //----------------
   8:   
   9:  /*
  10:  
  11:  * 繼續執行接下來的程式
  12:  
  13:  */
  14:   
  15:  //----------------
  16:   
  17:  string strResult = se.EndGetData(iarResult);
  18:   
  19:  MessageBox.Show(strResult); 

寫得比較簡陋一點 XD ,再呼叫Begin Method時,
Client端還可以同時去執行其他工作,
直到呼叫End Method後,將結果拿取回來。

這個方法對我來說很少使用,因為我比較喜愛使用訂閱事件的方式,
也就是說當結果產生時,才觸發事件通知我去拿取,
因為有可能是再呼叫End Method時,Service還未完成結果,
結果Client端就必須等在那等待Service回傳。

另一個寫法如下:
Service會產生一個有Async結尾的Method,Client端再去訂閱Completed事件,
例如:今天Service提供GetData的Method,所以會有GetDataAsync
Method與GetDataAsyncCompleted事件

   1:  SE.Service1Client se = new TestWCF1.SE.Service1Client();
   2:   
   3:  se.GetDataCompleted+=new EventHandler<TestWCF1.SE.GetDataCompletedEventArgs>se_GetDataCompleted);
   4:   
   5:  se.GetDataAsync(2);

之後Client再借由Completed Method取得回傳的資料。

   1:  void se_GetDataCompleted(object sender, TestWCF1.SE.GetDataCompletedEventArgs e)
   2:   
   3:  {
   4:       if (e.Cancelled){}
   5:       else if (e.Error != null){} 
   6:       else 
   7:      {
   8:          MessageBox.Show(e.Result);
   9:       }
  10:   }

先簡單寫到這!!!

2010-05-03

delegate 匿名方法的應用

最近在準備WCF考試也快告一個段落(畢竟5/7號就要考了,今天也已經5/4 >”<)
其實這樣匆匆的準備一個月的時間,很多部分看的都不是很懂,
或許是因為自己閱讀英文能力還不夠吧,所以看得有點吃力 >"<

最近常覺得程式開發的學習,真的是一條無止盡的路,
新的技術、新的概念、對我們這些程式設計者而言,
若不時常更新,可能隨時就被新潮流給掩沒!!
==========================================
今天來記錄一下,前陣子林大哥分享的技術。

在程式裡面,我們會常常需要使用到找尋某一個物件資料,
在.Net 2.0的時候,只要有實作IDictionay的類別都有索引鍵/值組,
也就是說將物件資料放進這個集合中,即可用Key找出相對應的物件,

這樣的物件集合對程式來說相當方便,但若遇到未實作這個介面的集合時
那又該如何呢??

舉例來說,假設今天有一個集合 List<string> ,我想要找集合中符合"AAA"的字串,
對我這樣的小嫩嫩設計師來說,可能會選擇這種寫法:

   1:  List<string> myList= new List<string>();
   2:  myList.Add("AAA");
   3:  myList.Add("BBB");
   4:  myList.Add("CCC");
   5:   
   6:  foreach (string thisString in myList)
   7:  {
   8:       if (thisString.CompareTo("AAA") == 0)
   9:      {
  10:            MessageBox.Show("找到AAA物件");                
  11:       }                
  12:  }

但其實還有一種更Smart的簡易寫法,
其實.Net 2.0時就有提供delegate 匿名方法寫法如下:

   1:  private void button1_Click(object sender, EventArgs e)
   2:  {
   3:      
   4:      List<string> myList= new List<string>();
   5:   
   6:      myList.Add("AAA");
   7:      myList.Add("BBB");
   8:   
   9:      myList.Add("CCC");
  10:   
  11:   
  12:      string strResult=myList.Find(delegate(string strFind) {
  13:   
  14:      return strFind.CompareTo("AAA")==0;
  15:   });

甚至於要將這個List集合來自訂Sort也可以,程式如下所示

   1:  List<string> myList= new List<string>();
   2:   
   3:      myList.Add("AAA");
   4:   
   5:      myList.Add("BBB");
   6:   
   7:      myList.Add("CCC");
   8:   
   9:   
  10:   
  11:      myList.Sort(delegate(string a, string b){
  12:   
  13:      return a.CompareTo(b);
  14:   
  15:  });


其實當然使用Linq這種簡單的功能也可以做到,反正就只是一個紀錄而以嚕。