異步調(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)函數(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 中找到。
新聞熱點
疑難解答
圖片精選