演练:创建队列和使用消息
更新:2007 年 11 月
本主题中的过程演示使用 MessageQueue 组件创建消息队列的过程。通过使用该组件,可以向队列发送消息并在队列中检索消息。该消息记录帮助请求。
说明: |
---|
若要在“服务器资源管理器”中查看队列信息或以编程方式访问队列,必须在客户端计算机上安装“消息队列”Windows 组件。若要添加此服务,请使用“控制面板”中的“添加或删除程序”。 |
说明: |
---|
对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您使用的 Visual Studio 版本及设置。有关更多信息,请参见Visual Studio 设置。 |
在您的计算机上创建消息队列
在“文件”菜单上指向“新建”,然后单击“项目”。
在“新建项目”对话框中,创建 Visual Basic 或 Visual C# 的“Windows 应用程序”。将其命名为 MessageQ。
打开“服务器资源管理器”。有关更多信息,请参见 如何:访问和初始化服务器资源管理器/数据库资源管理器。
展开“服务器”节点。
展开本地服务器的节点。按计算机名识别本地服务器的节点。
展开“消息队列”节点。
右击“专用队列”,然后单击创建队列。
为该队列名称输入 HelpRequest。不要选中“使队列具有事务性”。
一个名为“HelpRequest”的新专用队列被创建并出现在“服务器资源管理器”中。
说明: 您还可以通过“我的电脑”图标查看新创建的队列。右击桌面上的“我的电脑”图标,然后单击“管理”。展开“服务和应用程序”节点。展开“消息队列”节点并选择“专用队列”文件夹。新队列出现在队列列表中。
为您的消息队列添加 MessageQueue 组件
将 HelpRequest 队列从“服务器资源管理器”拖到窗体上。为“HelpRequest”队列配置的新 MessageQueue 组件将添加到项目中。
MessageQueue 组件用于以编程方式访问在上一节中创建的“HelpRequest”队列中所包含的消息。
将 MessageQueue 组件的“(Name)”属性设置为 helpRequestQueue。
在“属性”窗口中,展开 MessageReadPropertyFilter 节点。将“Priority”的值设置为 true。这样,当从队列中检索消息时,同时会检索消息的优先级。
您在下一个步骤中创建的用户界面允许用户输入一些帮助请求文本并设置消息的优先级。用户单击“发送”按钮将请求发送到队列。一个 DataGridView 控件显示队列的内容。用户界面还包含用队列的当前内容更新网格的按钮和清除队列的按钮。
创建用户界面
在“工具箱”的“Windows 窗体”选项卡中,将以下控件添加到 Form1:
两个 Label 控件
两个 TextBox 控件
三个 Button 控件
一个 CheckBox 控件
一个 DataGridView
设置以下控件属性:
控件
属性
新值
Label1
名称
Label2
消息
TextBox1
txtName
(空白)
TextBox2
txtMessage
(空白)
true
Button1
sendMessage
发送消息
Button2
refreshMessages
刷新消息列表
Button3
purgeMessages
清除消息列表
CheckBox1
highPriority
高优先级
DataGridView1
messageGrid
整齐地排列控件。
向队列发送消息
在设计器中,双击 sendMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
在方法中添加代码以创建新的 Message 实例并将其发送到队列,并更新消息显示。下一步中将编写 DisplayMessages 方法。
Private Sub sendMessage_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles sendMessage.Click Dim theMessage As System.Messaging.Message = _ New System.Messaging.Message(Me.txtMessage.Text) theMessage.Label = Me.txtName.Text If highPriority.Checked Then theMessage.Priority = Messaging.MessagePriority.Highest Else theMessage.Priority = Messaging.MessagePriority.Normal End If helpRequestQueue.Send(theMessage) DisplayMessages() End Sub
private void sendMessage_Click(object sender, System.EventArgs e) { System.Messaging.Message theMessage = new System.Messaging.Message(txtMessage.Text); theMessage.Label = txtName.Text; if (highPriority.Checked) theMessage.Priority = System.Messaging.MessagePriority.Highest; else theMessage.Priority = System.Messaging.MessagePriority.Normal; helpRequestQueue.Send(theMessage); DisplayMessages(); }
向项目添加 System.Data 引用。为 System.Data 添加 Imports 语句(.NET 命名空间和类型) (Visual Basic) 或 using(C# 参考) 语句。有关更多信息,请参见管理引用和如何:在 Visual Studio 中添加或移除引用 (Visual Basic)。
添加方法以在 DataGridView 控件中显示队列的内容。该方法使用 MessageQueue.GetAllMessages 方法来检索队列中的所有消息。将选定的队列属性添加到 DataTable 对象,该对象用作 DataGridView 控件的数据源。若要检索消息的文本,您必须为消息创建格式化程序。
Private Sub DisplayMessages() ' Create a DataTable Dim messageTable As New DataTable() messageTable.Columns.Add("Name") messageTable.Columns.Add("Message") messageTable.Columns.Add("Priority") Dim messages() As System.Messaging.Message messages = helpRequestQueue.GetAllMessages() ' Need a formatter to get the text of the message body. Dim stringFormatter As System.Messaging.XmlMessageFormatter = _ New System.Messaging.XmlMessageFormatter(New String() _ {"System.String"}) Dim index As Integer Dim am As System.Messaging.Message ' Add each message to the DataTable For index = 0 To messages.Length - 1 messages(index).Formatter = stringFormatter am = messages(index) messageTable.Rows.Add(New String() _ {am.Label, am.Body.ToString(), am.Priority.ToString()}) Next messageGrid.DataSource = messageTable End Sub
private void DisplayMessages() { DataTable messageTable = new DataTable(); messageTable.Columns.Add("Name"); messageTable.Columns.Add("Message"); messageTable.Columns.Add("Priority"); System.Messaging.Message[] messages; messages = helpRequestQueue.GetAllMessages(); System.Messaging.XmlMessageFormatter stringFormatter; stringFormatter = new System.Messaging.XmlMessageFormatter( new string[] {"System.String"}); for (int index = 0; index < messages.Length; index++) { messages[index].Formatter = stringFormatter; messageTable.Rows.Add(new string[] { messages[index].Label, messages[index].Body.ToString(), messages[index].Priority.ToString() }); } messageGrid.DataSource = messageTable;
}
显示队列的内容
在设计器中,双击 refreshMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
在 Click 事件处理程序中调用 DisplayMessages 方法。
Private Sub refreshMessages_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles refreshMessages.Click DisplayMessages() End Sub
private void refreshMessages_Click(object sender, System.EventArgs e) { DisplayMessages();
}
清除队列的内容
在设计器中,双击 purgeMessage 按钮以在“代码编辑器”中创建 Click 事件处理程序。
调用 helpRequestQueue 的 Purge 方法,然后刷新 DataGridView 控件的内容。
Private Sub purgeMessages_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles purgeMessages.Click helpRequestQueue.Purge() DisplayMessages() End Sub
private void purgeMessages_Click(object sender, System.EventArgs e) { helpRequestQueue.Purge(); DisplayMessages();
}
测试应用程序
按 F5 运行应用程序。
键入名称和短消息。
单击“发送消息”将消息发送到队列并更新显示。
单击“清除消息”以删除队列中的所有消息。消息列表将为空。