a. 一個(gè)客戶端程序(client side program)要從后臺(tái)數(shù)據(jù)庫取回一個(gè)復(fù)雜的數(shù)據(jù)集合。可能這個(gè)數(shù)據(jù)庫操作本身很費(fèi)時(shí),也可能是網(wǎng)絡(luò)傳輸?shù)臄?shù)度比較慢,總之這個(gè)方法調(diào)用可能要花20秒時(shí)間。如果使用同步調(diào)用,那么在數(shù)據(jù)庫結(jié)果返回之前,用戶必須耐心等待,什么也不能做。這時(shí)候你可能會(huì)希望這個(gè)調(diào)用慢慢的在別處進(jìn)行,程序馬上返回好讓你做其它的工作。等什么時(shí)候數(shù)據(jù)返回了,在進(jìn)行其隨后相應(yīng)的操作。這種情形下,你就需要對(duì)數(shù)據(jù)庫操作的方法進(jìn)行異步調(diào)用。
當(dāng)你用代表發(fā)出調(diào)用請(qǐng)求后,clr(公共語言運(yùn)行環(huán)境,common language runtime)接到這個(gè)請(qǐng)求,并將這個(gè)請(qǐng)求放置到一個(gè)內(nèi)部的處理隊(duì)列(queue)中去。一旦放置完成后,clr馬上就給調(diào)用者返回一個(gè)iasyncresult的對(duì)象。這個(gè)對(duì)象很重要,我們一會(huì)兒還要解釋他的具體作用。
dim ar as system.iasyncresult ar = delegate.begininvoke("class90",nothing, nothing) '*** 其它一些操作 。。。 '*** 檢查后臺(tái)調(diào)用狀態(tài) if (ar.iscompleted) then '*** 取回異步調(diào)用方法的結(jié)果 end if
'回調(diào)函數(shù)的參數(shù) dim myvalue as integer = 10 '回調(diào)函數(shù)的定義 sub puttodesk(byval ar as iasyncresult) dim x as integer = cint(ar.asyncstate)'拿到參數(shù) '相應(yīng)的操作 end sub '使用回調(diào)函數(shù)的方法 private callbackdelegate as asynccallback = addressof puttodesk ... dim ar as system.iasyncresult ar = delegate.begininvoke("class90",callbackdelegate, myvalue)