序
.Net Framework 2.0所提供的開發環境中,提供了簡單的方式讓你用非同步的方法呼叫Web Services
它使用MothodName後方加上Async名稱的函式當做呼叫方法,然後另外寫一個函式處理呼叫的回傳值
我想背後原理應該不脫離使用執行序(Thread)來達到這樣的功能。
參考資料中有微軟的範例,但它的做法如果用在連續呼叫的話可能會有些問題,而且沒有C#的範例,
所以我稍做修改成我需要的版本
開發環境
- Microsoft Visual Studio 2005 (.Net Framework 2.0)
- 專案類型:Windows 應用程式
- 已有一個簡單的Web Service,該Service中有個函式: Function hello(ByVal name As String) As String
- 我將Web Service加到名為wsServer的Web參考中
- 我在畫面中用一個多行的TextBox叫resultOut來顯示呼叫與回應的資訊
C#
//CallMyWSAsync用來New起Web service的實體,指定處理回應的函式,然後呼叫Web Service
private void CallMyWSAsync(string value)
{
//New起Web service的實體
wsServer.WebService ws = new wsServer.WebService();
//指定處理回應的函式
ws.helloCompleted += new wsServer.helloCompletedEventHandler(getCompletedHandler);
//resultOut來顯示呼叫的資訊
string o = "ID=" + ws.GetHashCode() + " Start, value=" + value;
o = DateTime.Now.ToString() + "\r\n" + o;
resultOut.Text = o + "\r\n" + resultOut.Text;
resultOut.Text = "\r\n" + resultOut.Text;
//呼叫Web Service
ws.helloAsync(value);
}
//getCompletedHandler用來處理回應
private void getCompletedHandler(object sender, wsServer.helloCompletedEventArgs e)
{
string o;
if (e.Error == null)
{
o = "ID=" + sender.GetHashCode() + " Done, Result: " + e.Result; //e.Result可取得回應的物件
}
else
{
o = e.Error.Message;
}
//resultOut來顯示回應的資訊
o = DateTime.Now.ToString() + "\r\n" + o;
resultOut.Text = o + "\r\n" + resultOut.Text;
resultOut.Text = "\r\n" + resultOut.Text;
}
VB
'CallMyWSAsync用來New起Web service的實體,指定處理回應的函式,然後呼叫Web Service
Sub CallMyWSAsync(ByVal value As String)
'New起Web service的實體
Dim ws As New wsServer.WebService
'指定處理回應的函式
AddHandler ws.helloCompleted, AddressOf getCompletedHandler
'resultOut來顯示呼叫的資訊
Dim o As String = "ID=" + ws.GetHashCode() + " Start, value=" + value
o = DateTime.Now.ToString() + vbCrLf + o
resultOut.Text = o + vbCrLf + resultOut.Text
resultOut.Text = vbCrLf + resultOut.Text
'呼叫Web Service
ws.helloAsync(value)
End Sub
'getCompletedHandler用來處理回應
Private Sub getCompletedHandler(ByVal sender As Object, ByVal e As wsServer.helloCompletedEventArgs)
Dim o As String
If e.Error Is Nothing Then
o = "ID=" + sender.GetHashCode() + " Done, Result: " + e.Result 'e.Result可取得回應的物件
o = DateTime.Now.ToString() + vbCrLf + o
resultOut.Text = o + vbCrLf + resultOut.Text
resultOut.Text = vbCrLf + resultOut.Text
Else
o = e.Error.Message
End If
'resultOut來顯示回應的資訊
o = DateTime.Now.ToString() + vbCrLf + o
resultOut.Text = o + vbCrLf + resultOut.Text
resultOut.Text = vbCrLf + resultOut.Text
End Sub
後言
這是我第一次寫C#的程式,因為我想順便體驗C#開發起來有何不同,
我在查資料時,還有看到ASP.Net的網頁也可以設為Async,不過會有什麼結果我沒試過,下回有空再寫寫札記吧
0 意見:
張貼留言