国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET Framework中使用XML Web Service(2)

2024-07-10 12:58:52
字體:
供稿:網(wǎng)友
中國最大的web開發(fā)資源網(wǎng)站及技術(shù)社區(qū),

異步調(diào)用 xml web service 分兩個步驟。第一步,調(diào)用 begin 方法以初始化 web 方法調(diào)用。第二步,調(diào)用 end 方法以完成 xml web service 調(diào)用并檢索 xml web service 的響應(yīng)。

begin 方法返回一個 system.web.services.protocol.webclientasyncresult 對象,用于實現(xiàn) system.iasyncresult 接口。此對象提供關(guān)于待定異步調(diào)用的狀態(tài)信息。通過將此對象傳遞給 end 方法,代理類可以標識要完成的請求,尤其是同時生成多個異步調(diào)用時。

有多種方法可以確定異步 xml web service 調(diào)用何時完成:

  • 向 begin 方法傳遞一個回調(diào)委托。回調(diào)委托將在 xml web service 調(diào)用完成后執(zhí)行。
  • 使用 iasyncresult.asyncwaithandle 對象的 waithandle 方法之一強制應(yīng)用程序等待。使用 waithandle 類的方法時,客戶端也可以指定超時,超時過后,客戶端將不再等待調(diào)用的 xml web service 的結(jié)果。
  • 在主線程代碼中輪詢 iasyncresult.iscompleted 屬性的值以查找值 true。如果此屬性為 true,則調(diào)用 end 方法以檢索 xml web service 的響應(yīng)。
  • 可直接調(diào)用 end 方法,而無需使用其他技術(shù)確定異步 xml web service 調(diào)用是否完成。此方法將中斷調(diào)用線程的執(zhí)行,直到異步調(diào)用完成為止。

最有效的方法是向 begin 方法傳遞一個回調(diào)委托,因為回調(diào)函數(shù)在等待響應(yīng)期間不會中斷線程。xml web service 返回其響應(yīng)時,回調(diào)委托將在新線程中執(zhí)行。然后,在回調(diào)中調(diào)用 end 方法。

以下代碼演示了如何創(chuàng)建異步 xml web service 調(diào)用;此代碼顯示了對 begingetitems 的調(diào)用,語法如下:

begingetitems(system.asynccallback callback, object asyncstate);

begingetitems 使用兩個參數(shù),第一個是 asynccallback 對象,它是通過在構(gòu)造函數(shù)內(nèi)傳遞 servicecallback 方法的地址創(chuàng)建的。第二個參數(shù)是對象類型的參數(shù),可以傳遞任何可幫助您處理 xml web service 響應(yīng)的對象。可以通過獲取回調(diào)方法中 iasyncresult 參數(shù)的 asyncstate 屬性來訪問此同一對象。在以下示例中,以這種方式傳遞的對象是 xml web service 代理對象,因此在執(zhí)行回調(diào)委托時,可以調(diào)用 endgetitems,如下面的 servicecallback 方法所示。

private void button2_click(object sender, system.eventargs e){    // 禁用 async 按鈕并清除任何數(shù)據(jù)的 listview    // 創(chuàng)建 xml web service 代理類的實例    bookcatalog.service1 ws = new bookcatalog.service1();    // 創(chuàng)建對回調(diào)委托的引用    asynccallback cb = new asynccallback(servicecallback);    // 調(diào)用 begin 方法,將回調(diào)委托和    // 此代理類實例作為 asyncstate 對象傳遞。     ws.begingetitems(cb,ws);}private void servicecallback(iasyncresult ar){    // 將 asyncstate 對象轉(zhuǎn)換為代理對象    bookcatalog.service1 ws = (bookcatalog.service1)ar.asyncstate;    // 調(diào)用 end 方法并將響應(yīng)指定給 dataset    dataset ds = ws.endgetitems(ar);    // 遍歷 dataset 并將每個行的 title_id 和 title 字段    // 添加至 listview    foreach(datarow drbook in ds.tables[0].rows) {        // 創(chuàng)建一個新 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 調(diào)用比生成同步調(diào)用所需的代碼稍多,但最終結(jié)果可以生成響應(yīng)更快的應(yīng)用程序,因此還是值得的。

重要信息:異步調(diào)用 xml web service 時,請使用多線程編程技術(shù)。

生成異步 xml web service 調(diào)用時,如果不使用多線程技術(shù),則在兩個或多個線程同時嘗試訪問同一數(shù)據(jù)時,將會出現(xiàn)問題。技術(shù)之一(如以下代碼所示)就是在 c# 中使用 lock 語句來獲取對對象的相互獨占的訪問權(quán),以拒絕其他線程的訪問。

private void servicecallback(iasyncresult ar){    // 將 asyncstate 對象轉(zhuǎn)換為代理對象    bookcatalog.service1 ws = (bookcatalog.service1)ar.asyncstate;    // 調(diào)用 end 方法并將響應(yīng)指定給 dataset    dataset ds = ws.endgetitems(ar);    // 使用 lock 語句防止其他線程訪問    //  listview,直到完成對它的更新    lock(this.listview1)    {                // 遍歷 dataset 并將每個行的 title_id 以及         // title 字段添加至 listview        foreach(datarow drbook in ds.tables[0].rows) {            // 創(chuàng)建一個新 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);        }    }}

您還應(yīng)該學習其他技術(shù),例如,使用 monitor 類和 control.invoke 來生成線程安全的應(yīng)用程序。有關(guān)多線程編程技術(shù)的詳細信息,可在 msdn® library 中找到。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 方城县| 方山县| 镇安县| 乌拉特中旗| 翼城县| 墨脱县| 盐边县| 达拉特旗| 永胜县| 武平县| 土默特左旗| 茂名市| 靖州| 尉氏县| 福海县| 威海市| 始兴县| 名山县| 金塔县| 顺平县| 南郑县| 花莲县| 陆丰市| 饶河县| 荆门市| 包头市| 闽侯县| 外汇| 林州市| 伽师县| 栾城县| 靖江市| 安新县| 张北县| 临澧县| 常熟市| 石嘴山市| 拉孜县| 土默特右旗| 伊通| 青川县|