一、安装Message Queue:

在Win7之前,控制面板,添加删除组件(Windows Message Queue)。

Win7~Win8:控制面板,程序和功能,启用或关闭Windows功能(找到Windows Message Queue服务器)选项,连同所有子类一并勾上即可,自动安装。

二、使用Message Queue:

1)用于各类服务器、计算机之间的通讯:

本地,自己给自己发(直接是.\\Private$\\Queue的私有名字)。

远程计算机:

FormatName:Direct=TCP:121.0.0.1\\private$\\Queue名字
FormatName:Direct=OS:machinename\\private$\\Queue名字 (仅用于远程加了域的计算机)。
FormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/Queue名字

注意:FormatName必须大小写完全按照红色的写法!"Direct"可以随意。

2)默认情况下,Queue会收到该组全部信息。有时候我们需要跨域但是指定某台计算机收到特定信息(比如N台有1,2,3……N编号的计算机都连接到某个服务器Queue,但是不同计算机有唯一编号,我发送的信息只发送给特定的计算机编号)。那么可以使用System.Message(使用前必须引用该类库)的Label,代码如下(包含收到消息后删除该信息,防止Queue里东西越来越多):

此案例是在我本人计算机上运行,界面上一个“发送”按钮和2个文本框(分别接受Label为1和2的消息),防止时间演示过长,使用了异步机制。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Messaging;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using Msg = System.Messaging.Message; namespace MessageQueueDemo
{
public partial class Form1 : Form
{ public Form1()
{
InitializeComponent();
} private async Task<string> GetMessage(string labelId)
{
List<Msg> msgs = new List<Msg>();
//监听当前自己计算机上的私有队列
MessageQueue msgQueue = new MessageQueue(@".\private$\myQueue");
string result = null;
Random r = new Random(); await Task.Run(() =>
{
//使用该方法允许您动态删除Queue
var me = msgQueue.GetMessageEnumerator2();
Msg tmpMsg = null; for (IEnumerator pointer = me; pointer.MoveNext();)
{
//先返回当前的Queue
tmpMsg = (Msg)pointer.Current;
//如果该Label是符合当前文本框可以接受的Id,删除该Msg
if (tmpMsg.Label == labelId)
{
tmpMsg = me.RemoveCurrent();
//模拟接收的时间不同
Thread.Sleep(r.Next(, ));
//必须指定每一个Msg的存储信息格式
tmpMsg.Formatter = new XmlMessageFormatter(new Type[] { typeof(string) });
msgs.Add(tmpMsg);
//必须加上去,因为删除当前的Msg之后不使用“重置”,导致MoveNext为false。
me.Reset();
}
}
if (msgs.Count > )
{
result = string.Join(",", (from m in msgs
select m.Body.ToString()));
}
});
return result;
} private async void button1_Click(object sender, EventArgs e)
{
//初始化已经创建的Queue
MessageQueue msgQueue = new MessageQueue(@".\private$\myQueue");
//模拟发送Msg(1和2交替发送)
for (int i = ; i < ; i++)
{
Msg message = new Msg(i % == ? "" : "", new XmlMessageFormatter(new Type[] { typeof(string) })); //Send第一个参数:发送的消息对象;第二个参数:Label
                 msgQueue.Send(message, i %  ==  ? "" : "");
            }

            //异步接收
var content1 = await GetMessage("");
var content2 = await GetMessage("");
textBox2.Text = content1;
textBox3.Text = content2;
}
}
}

Message Queue基本使用说明的更多相关文章

  1. 初识Message Queue之--基础篇

    之前我在项目中要用到消息队列相关的技术时,一直让Redis兼职消息队列功能,一个偶然的机会接触到了MSMQ消息队列.秉着技术还是专业的好为原则,对MSMQ进行了学习,以下是我个人的学习笔记. 一.什么 ...

  2. MSMQ(Microsoft Message Queue)

    http://www.cnblogs.com/sk-net/archive/2011/11/25/2232341.html 利用 MSMQ(Microsoft Message Queue),应用程序开 ...

  3. Message Queue vs. Web Services?

    From stackoverflow.com When you use a web service you have a client and a server: If the server fail ...

  4. hdu 1509 Windows Message Queue

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1509 Windows Message Queue Description Message queue ...

  5. 为什么要用Message Queue

    摘录自博客:http://dataunion.org/9307.html?utm_source=tuicool&utm_medium=referral 为什么要用Message Queue 解 ...

  6. 单线程模型中Message、Handler、Message Queue、Looper之间的关系

    1. Android进程 在了解Android线程之前得先了解一下Android的进程.当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程.默认的情况下,所有该程序的组件都 ...

  7. Top 10 Uses of a Message Queue

    Top 10 Uses of a Message QueueAsynchronicity, Work Dispatch, Load Buffering, Database Offloading, an ...

  8. hdoj 1509 Windows Message Queue【优先队列】

    Windows Message Queue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  9. 详解boost库中的Message Queue .

    Message Queue(后文简写成MQ或消息队列)是boost库中用来封装进程间通信的一种实现,同一台机器上的进程或线程可以通过消息队列来进行通迅.消息队列中的消息由优先级.消息长度.消息数据三部 ...

随机推荐

  1. 【转载】UML类图几种关系的总结

    因为有的时候很久不弄UML图,老是忘记几个常见的连接线的意思,这篇完全说转载:UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Real ...

  2. 等等,你可能误解nodejs了–通俗的概括nodejs的真相

    最近刚把产品从cpp平台迁移到nodejs平台了.  很多以前关于nodejs的观念被颠覆了. 这里分享出来, 欢迎大家批评指正. "nodejs是做服务器端开发的, 它一定和web相关,几 ...

  3. Visual Studio Error

    Visual Studio Error 注意:文中所有“系统”用词,均指Windows Console操作系统IO Debug Error 错误类型 #0表示调用约定错误 可以考虑在指针前面加上_st ...

  4. RobotFramework的Setup和Teardown

    测试套件级别的Setup会在本套件测试用例集合执行前先执行,同理Teardown会在本组所有用例执行完成后运行 测试用例级别的Setup会在本条测试用例执行前先执行,同理Teardown会在本条用例执 ...

  5. django drf 初探serializer

    1.定义Model对应的serializer from rest_framework import serializers class GoodsSerializer(serializers.Seri ...

  6. BT Tracker的原理及.Net Core简单实现Tracker Server

    最近很忙,自上次Blog被盗 帖子全部丢失后也很少时间更新Blog了,闲暇在国外站点查阅资料时正好看到一些Tracker 的协议资料,也就今天记录并实践了下,再次分享给大家希望可以帮到需要的小伙伴. ...

  7. MVC的 url 传递参数无效

    有些符号(例如“=”)在URL中 直接传递是无效的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码       十六进制值 1. + URL 中+号表 ...

  8. Mysql数据类型《二》字符类型

    字符类型 #官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定 ...

  9. fread和fwrite用法小结

    fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h>size_t fread(void *p ...

  10. 实用的bash别名和函数

    本文来自于:程序师 作为一个命令行探索者,你或许发现你自己一遍又一遍重复同样的命令.如果你总是用ssh进入到同一台电脑,如果你总是将一连串命令连接起来,如果你总是用同样的参数运行一个程序,你也许希望在 ...