非同步訊息處理
更新:2007 年 11 月
如果您要在不阻礙應用程式運作的情況下擷取訊息,您可以非同步的方式來擷取訊息。在非同步訊息處理中,會立即傳回啟動工作的方法,而不需等候結果。當工作完成的同時,應用程式還是可繼續進行它原本正在進行的工作。工作完成時,伺服器會告知應用程式已成功處理訊息。
非同步訊息作業有兩種:非同步接收訊息和非同步窺視訊息。當您非同步擷取訊息時,可使用 BeginReceive 方法和 EndReceive 方法,來標記作業的開始和結束。採取的動作如下:
當可取得佇列上的訊息或是您正在窺視或接收的訊息已存在,BeginReceive 方法會立即傳回,並引發名為 ReceiveCompleted 的事件。
ReceiveCompleted 事件會傳回 IAsyncResult 型別的物件,其中包含非同步作業的資訊。
在接收完成事件之後,您可以呼叫 EndReceive 方法來完成作業。在結束呼叫中,您可以存取 ReceiveCompletedEventArgs 類別來存取或擷取訊息。
您可以在作業進行期間存取 IAsyncResult 物件,但通常不會在呼叫 EndReceive 之前使用它。不過,如果您啟動了幾項非同步作業,則可將它們的 IAsyncResult 值放在陣列中,並指定是否要等候所有作業或個別作業完成。在這種情況下,您可以使用 IAsyncResult 物件的 AsyncWaitHandle 屬性來辨識完成的作業。
Peek (如同 Receive) 會使用兩個稱為 BeginPeek 和 EndPeek 的方法,來界定非同步作業的開始和結束。BeginPeek 會在訊息變成可用時,立即傳回並引發稱為 PeekCompleted 的事件。如同 ReceiveCompleted 一樣,這個事件也會傳回 IAsyncResult 物件,讓您能操作該項作業的資訊。
除此之外,非同步接收和窺視作業都使用逾時時限來指定您要等候多久以取得訊息。若要這麼做,您可以使用任一方法的多載形式,來傳遞表示等候時間的 TimeSpan 物件。如果逾時週期到期,則會引發 ReceiveCompleted 或 PeekCompleted 事件,但是 IAsyncResult 物件上的 IsCompleted 屬性會設定為 false 以表示未處理訊息。
如需非同步處理的詳細資訊,請參閱下列頁面:
如需 |
請參閱 |
---|---|
非同步接收訊息的逐步說明 |
|
BeginPeek 方法及其成員的概觀 |
|
BeginReceive 方法及其成員的概觀 |
接收非同步作業的告知
當您的非同步接收或窺視作業成功完成時,您可利用以下兩種方式來接收告知:
您可以建立事件處理常式,它將在 ReceiveCompleted 或 PeekCompleted 事件發生時加以處理。
您可使用回呼來自動監看傳入的訊息並在訊息到達時將處理傳遞至您的應用程式。
當您使用事件告知時,會建立方法來處理訊息處理,以及在處理完成時傳回告知。接著會呼叫開始非同步處理的方法。當您在設計工具中按兩下 MessageQueue 元件時,系統會自動為您建立事件處理常式。
![]() |
---|
在事件告知的案例中,BeginPeek 或 BeginReceive 會傳回一則訊息,接著停止處理。您必須為要擷取的每個訊息再次呼叫 BeginPeek 或 BeginReceive。 |
另外您也可使用回呼來非同步處理訊息。回呼會辨識您要與 BeginPeek 或 BeginReceive 作業相關聯的委派。在這種情況下,委派會在處理每個訊息後繼續監看新的事件告知。