方法 : メッセージの非同期受信します。
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 空白のトピックは、プレースホルダーとして挿入されています。]
2 つの方法で非同期的にメッセージを取得できます。イベント ハンドラーを使用する操作の処理の完了時またはコールバックを使用して通知を受信するため。 非同期メッセージングの概要、については 非同期メッセージの処理 を参照してください。
イベントの通知] ではまず、イベント ハンドラー、非同期呼び出しが完了したらを実行するプロシージャにバインドします。 コード内で BeginReceive メソッドを呼び出します。 この、非同期処理を開始し、メッセージがわかりしだい、またはタイムアウト パラメーターは、期限が切れたときにコンポーネントに処理を返します。 呼び出しが戻るとき、システム定義したデリゲートを実行し、取得の結果を処理します。 操作の終わりを示すEndReceive メソッドを呼び出します。
注意
BeginReceive 1 つのメッセージのみが取得されます。メッセージを非同期的に処理を続行する場合は、もう一度 BeginReceive メソッドを呼び出すかを引き続き、キューに到着する新しいメッセージを監視するデリゲートを呼び出す BeginReceive でのコールバック パラメーターを使用する必要がありますください。
非同期的にメッセージを受け取り、に加えてすることができますピーク メッセージ非同期的にします。 両方のプロセスのパターンは非常に似ていますが、BeginPeek メソッドを使用する非同期のピーク] を。
MessageQueue オブジェクトをプログラムで作成するには
プロジェクトに System.Messaging.dll への参照を追加します。
実装は、し、その MessageQueue プロパティ (コンストラクター) と Path プロパティを設定するクラスに Formatter オブジェクトのインスタンスを作成します。
' Add this to the constructor Dim targetTypeNames = {"System.String,mscorlib"} mq.Formatter = New System.Messaging.XmlMessageFormatter(targetTypeNames)
// Add this to the class declarations. System.Messaging.MessageQueue mq = new System.Messaging.MessageQueue(".\\MyQueue"); // Add this to the constructor. mq.Formatter = new System.Messaging.XmlMessageFormatter( newstring[] { "System.String,mscorlib" });
MessageQueue オブジェクトをデザイナーで作成するには
プロジェクトに System.Messaging.dll への参照を追加します。
のツールボックス、 MessageQueue コンポーネントをデザイナーにドラッグします。 QueueName プロパティを mq に設定します。 Formatter プロパティを XmlMessageFormatter に設定します。 Path プロパティを ".\MyQueue" に設定します。
非同期イベント通知を使ってメッセージを受信
ReceiveCompleted イベントのイベント ハンドラーを作成します。 デザイナーで、MessageQueue コンポーネントをダブルクリックし、次のようにコードを追加します。
Private Sub mq_ReceiveCompleted( ByVal sender As System.Object, ByVal e As System.Messaging.ReceiveCompletedEventArgs ) Handles mq.ReceiveCompleted ' Add code here to respond to message.EndSub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { // Add code here to respond to message. }
Message オブジェクトの非同期呼び出しの結果を取得するを使用して、メッセージを取得するイベント ハンドラー内でコード記述します。 次のコード、メッセージを取得し、コンソールに表示します。
Private Sub mq_ReceiveCompleted( ByVal sender As System.Object, ByVal e As System.Messaging.ReceiveCompletedEventArgs ) Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( {"System.String,mscorlib"}) Console.WriteLine("Message: " & m.Body.ToString()) EndSub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( newstring[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); }
非同期操作を開始するコードで、任意の場所 BeginReceive メソッドを呼び出します。 たとえば、次のコードは、ユーザーがボタンをクリックするとメソッドを呼び出します。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click mq.BeginReceive() EndSub
private void button1_Click(object sender, System.EventArgs e) { mq.BeginReceive(); }
BeginReceive イベント ハンドラーで、もう一度 ReceiveCompleted メソッドを呼び出すメッセージを非同期的に受信を継続する場合は、以下に示します。 これにより、引き続き、キューに受信したときに新しいメッセージを処理コンポーネント。
Private Sub mq_ReceiveCompleted( ByVal sender As System.Object, ByVal e As System.Messaging.ReceiveCompletedEventArgs ) Handles mq.ReceiveCompleted Dim m As System.Messaging.Message = mq.EndReceive(e.AsyncResult) m.Formatter = New System.Messaging.XmlMessageFormatter( {"System.String,mscorlib"}) Console.WriteLine("Message: " & m.Body.ToString()) mq.BeginReceive() EndSub
private void mq_ReceiveCompleted(object sender, System.Messaging.ReceiveCompletedEventArgs e) { System.Messaging.Message m = mq.EndReceive(e.AsyncResult); m.Formatter = new System.Messaging.XmlMessageFormatter( newstring[] { "System.String,mscorlib" }); Console.WriteLine("Message: " + (string)m.Body); mq.BeginReceive(); }
使用して、コールバックを非同期でメッセージを受信
メッセージ タスクに関連情報を定義するクラスを作成します。 ここでは、Customer クラスを定義します。
Public Class Customer Public Name AsString = ""PublicSubNew(ByVal newName AsString) Name = newName EndSubEndClass
public class Customer { publicstring Name = ""; public Customer(string name) { Name = name; } }
クラスのインスタンスを作成します。 このオブジェクトは、コールバック メソッドに渡されます。
Dim george AsNew Customer("George")
Customer george = new Customer("George");
AsyncCallback デリゲートに対してコールバック メソッドを作成します。 このメソッドは、メッセージの受信後に実行する処理。 AsyncState パラメーターの result プロパティは、メッセージのタスクに関する情報を渡す作成するオブジェクト。 ここでは、AsyncState は Customer オブジェクトです。
Private Sub ReceiveCallback(ByVal result As System.IAsyncResult) Dim buyer As Customer = CType(result.AsyncState, Customer) Dim buyerName AsString = buyer.Name EndSub
private void ReceiveCallback(System.IAsyncResult result) { Customer buyer = (Customer)result.AsyncState; string buyerName = buyer.Name; }
非同期操作を開始するコードで、任意の場所 BeginReceive メソッドを呼び出します。 たとえば、次のコードは、ユーザーがボタンをクリックするとメソッドを呼び出します。 メッセージはメッセージ キューに送信して、キューから表示されます。 、、上記の手順 3 で定義されている、ReceiveCallback 方法と、メッセージを受け取ったとき呼びます。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click MessageQueue1.Send("Buy six eggs.", george.Name) MessageQueue1.BeginReceive(New System.TimeSpan(0, 0, 5), george, AddressOf ReceiveCallback) EndSub
private void button1_Click(object sender, System.EventArgs e) { messageQueue1.Send("Buy six eggs.", george.Name); messageQueue1.BeginReceive(new System.TimeSpan(0, 0, 5), george, new System.AsyncCallback(this.ReceiveCallback)); }
参照
処理手順
方法 : MessageQueue コンポーネントのインスタンスを作成します。