異步

 生成異步 Web 服務調用
  通過生成異步 XML Web Service 調用,您可以在等待 XML Web Service 作出響應時繼續使用調用線程。也就是說,用戶可以在應用程序未鎖定的情況下繼續與其交互,而 XML Web Service 訪問也將繼續進行。這是一種更好的設計模式,通過使用多線程支持,可以更有效地在智能設備應用程序中使用線程。生成異步調用時,將在不同於運行用戶界面的線程中生成調用。XML Web Service 應用程序不需要任何特殊配置即可支持異步訪問,也不需要知道調用方式是同步還是異步。代理類中的每個同步方法都有相應的 Begin 和 End 方法。例如,如果 XML Web Service 方法名爲 GetItems,則異步方法爲 BeginGetItems 和 EndGetItems。

  異步調用 XML Web Service 分兩個步驟。第一步,調用 Begin 方法以初始化 Web 方法調用。第二步,調用 End 方法以完成 XML Web Service 調用並檢索 XML Web Service 的響應。

  Begin 方法返回一個 System.Web.Services.Protocol.WebClientAsyncResult 對象,用於實現 System.IAsyncResult 接口。此對象提供關於待定異步調用的狀態信息。通過將此對象傳遞給 End 方法,代理類可以標識要完成的請求,尤其是同時生成多個異步調用時。

  有多種方法可以確定異步 XML Web Service 調用何時完成:

  向 Begin 方法傳遞一個回調委託。回調委託將在 XML Web Service 調用完成後執行。

  使用 IAsyncResult.AsyncWaitHandle 對象的 WaitHandle 方法之一強制應用程序等待。使用 WaitHandle 類的方法時,客戶端也可以指定超時,超時過後,客戶端將不再等待調用的 XML Web Service 的結果。

  在主線程代碼中輪詢 IAsyncResult.IsCompleted 屬性的值以查找值 true。如果此屬性爲 true,則調用 End 方法以檢索 XML Web Service 的響應。

  可直接調用 End 方法,而無需使用其他技術確定異步 XML Web Service 調用是否完成。此方法將中斷調用線程的執行,直到異步調用完成爲止。

  最有效的方法是向 Begin 方法傳遞一個回調委託,因爲回調函數在等待響應期間不會中斷線程。XML Web Service 返回其響應時,回調委託將在新線程中執行。然後,在回調中調用 End 方法。

  以下代碼演示瞭如何創建異步 XML Web Service 調用;此代碼顯示了對 BeginGetItems 的調用,語法如下:

  BeginGetItems(System.AsyncCallback callback, object asyncState);

  BeginGetItems 使用兩個參數,第一個是 AsyncCallback 對象,它是通過在構造函數內傳遞 ServiceCallback 方法的地址創建的。第二個參數是對象類型的參數,可以傳遞任何可幫助您處理 XML Web Service 響應的對象。可以通過獲取回調方法中 IAsyncResult 參數的 AsyncState 屬性來訪問此同一對象。在以下示例中,以這種方式傳遞的對象是 XML Web Service 代理對象,因此在執行回調委託時,可以調用 EndGetItems,如下面的 ServiceCallback 方法所示。

private void button2_Click(object sender, System.EventArgs e)
{
// 禁用 Async 按鈕並清除任何數據的 ListView
// 創建 XML Web Service 代理類的實例
BookCatalog.Service1 ws = new BookCatalog.Service1();
// 創建對回調委託的引用
AsyncCallback cb = new AsyncCallback(ServiceCallback);
// 調用 Begin 方法,將回調委託和
// 此代理類實例作爲 AsyncState 對象傳遞。
ws.BeginGetItems(cb,ws);
}

private void ServiceCallback(IAsyncResult ar)
{
// 將 AsyncState 對象轉換爲代理對象
BookCatalog.Service1 ws = (BookCatalog.Service1)ar.AsyncState;
// 調用 End 方法並將響應指定給 DataSet
DataSet ds = ws.EndGetItems(ar);

// 遍歷 DataSet 並將每個行的 Title_ID 和 Title 字段
// 添加至 ListView
foreach(DataRow drBook in ds.Tables[0].Rows) {
// 創建一個新 ListViewItem 添加到 ListView
ListViewItem book = new ListViewItem();
// 將 Title_ID 字段指定給 Text 屬性
book.Text = drBook["Title_ID"].ToString();
// 將 Title 字段指定給第一個 SubItem
book.SubItem[0].Text = drBook["Title"].ToString();
// 將書 ListViewItem 添加到 ListView
listView1.Items.Add(book);
}
}

  儘管生成異步 XML Web Service 調用比生成同步調用所需的代碼稍多,但最終結果可以生成響應更快的應用程序,因此還是值得的。

 

以上是web調用方法

 

以下是Form調用service方法

localhost.Service myService = new FtpCode.localhost.Service();
myService.GetDSAsync();
myService.GetDSCompleted +=new FtpCode.localhost.GetDSCompletedEventHandler(myService_GetDSCompleted);

 

 private void myService_GetDSCompleted(object sender, FtpCode.localhost.GetDSCompletedEventArgs e)
 {
            DataSet myds = e.Result;
 }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章