還是一樣開始慢慢練習WCF,首先就先從最常使用的Asynchronous 呼叫來練習。
非同步的呼叫,對設計Client端應用程式來說相當重要,
因為在向Service請求回應時,為了要等待Service回應,
應用程式必須要等待,萬一這段期間需要很長的處理時間,
程式就會停在那,完全無法動作
(這點再設計Client端時需要注意,因為使用者會誤認為當機)
所以,不管是Service或是在Client端執行邏輯時,
我都會將需要花很長時間才能完成的程式,
放在背景執行,並有Progress bar來顯示進度。。。
好了~廢話少說,就先來練習這個小小的課題!
要使用非同步的Method,首先先在[加入服務參考]中
選擇[進階]選項->勾選[產生非同步作業]
之後在Client端中,新增一個ServiceClient,
可以在intellisense中找到有Begin開頭與End開頭的Method,
程式碼如下:
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: }
先簡單寫到這!!!