非同步呼叫輕量級封裝AsynCaller

2021-08-22 01:40:43 字數 2660 閱讀 8189

當ui動作引發乙個耗時的計算時,我們經常需要將這個耗時的過程放到後台執行緒中去完成,然後獲取該過程的結果。使用.net提供的預設設施,無論是使用thread還是使用非同步呼叫,細節都比較繁瑣。在前幾天的blog上也看到了有些兄台的解決方案,但是覺得還不夠好用,於是自己封了乙個asyncaller。

asyncaller通過事件來通知外部非同步呼叫的結果,iasyncaller介面如下:

public

inte***ce

iasyncaller

public

delegate

void

cbacktaskcompleted(

object

result);

public

delegate

void

cbackexceptionthrown(exceptionee);

public

delegate

void

cbacktaskcanceled();

上面的介面清晰易懂,所需要注意的就是initialize方法,它的第乙個引數是需要進行非同步呼叫的目標方法的委託,delegate就像乙個萬能的delegate,它可以匹配到任何簽名的方法。

介面出來後,其實現asyncaller就很容易寫了。

public

class

asyncaller:iasyncaller

public

void

start()

public

void

cancel()

#region

backthread

private

void

backthread()

catch

(exceptionee)

else}}

#endregion

#region

event

private

void

activatetaskcompleted(

object

result)

}private

void

activateexceptionthrown(exceptionee)

}private

void

activatetaskcanceled()

}public

event

cbacktaskcompletedtaskcompleted

remove

}public

event

cbacktaskcanceledtaskcanceled

remove

}public

event

cbackexceptionthrownexceptionthrown

remove

}#endregion

#endregion}

下面給出乙個示例來說明如何使用iasyncaller。

比如在乙個form中,有兩個按鈕,乙個用於啟動非同步呼叫,乙個用於取消操作。首先寫乙個耗時的方法,用於非同步呼叫:

private

void

computetask(

intcount)次"

,i);}}

然後在form中新增成員變數:

private

iasyncallertheasyncaller

=null

; 在建構函式中,初始化theasyncaller,並預定對應的事件:

object

args=;

this

.theasyncaller

=new

asyncaller();

this

.theasyncaller.initialize(

newcback1(

this

.computetask),args);

this

.theasyncaller.taskcanceled

+=new

cbacktaskcanceled(theasyncaller_taskcanceled);

this

.theasyncaller.taskcompleted

+=new

cbacktaskcompleted(theasyncaller_taskcompleted);

事件處理函式如下:

private

void

button1_click(

object

sender,system.eventargse)

private

void

button2_click(

object

sender,system.eventargse)

private

void

theasyncaller_taskcanceled()

private

void

theasyncaller_taskcompleted(

object

result)

為了簡化,上面的示例在後台執行緒中呼叫的了ui顯示,這在真正的應用中是萬萬不可的。同時要注意,上面的示例中,iasyncaller介面事件的事件處理函式也是在後台執行緒中呼叫的,也存在同樣的問題。

同步呼叫與非同步呼叫

一 什麼是同步呼叫與非同步呼叫 定義 1 同步就是整個處理過程順序執行,當各個過程都執行完畢,並返回結果。2 非同步呼叫則是只是傳送了呼叫的指令,呼叫者無需等待被呼叫的方法完全執行完畢 而是繼續執行下面的流程。例如,在某個呼叫中,需要順序呼叫 a,b,c三個過程方法 如他們都是同步呼叫,則需要將他們...

JQ 非同步呼叫

請求 test.php 網頁,忽略返回值。jquery 程式 get test.php 請求 test.php 網頁,傳送2個引數,忽略返回值。jquery 程式 get test.php 顯示 test.php 返回值 html 或 xml,取決於返回值 jquery 程式 get test.ph...

html 非同步呼叫

我們的例項在 open 的第三個引數中使用了 true 該引數規定請求是否非同步處理。true 表示指令碼會在 send 方法之後繼續執行,而不等待來自伺服器的響應。onreadystatechange 事件使 複雜化了。但是這是在沒有得到伺服器響應的情況下,防止 停止的最安全的方法。通過把該引數設...