當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 事件使 複雜化了。但是這是在沒有得到伺服器響應的情況下,防止 停止的最安全的方法。通過把該引數設...