您当前的位置:首页 > 淘宝百科

messagequeue(c#中怎样创建消息队列)

时间:2023-01-29 12:02:16

本文目录

  • c#中怎样创建消息队列
  • android messagequeue 什么时候生成的
  • 进程间的通信方式各有什么优缺点
  • android:Exception in MessageQueue callback: handleReceiveCallback异常
  • 怎么在c#中访问messagequeue的死信队列
  • Microsoft Message Queue是什么!有什么用
  • 什么是消息队列
  • android messagequeue 阻塞会影响性能吗
  • android主线程中是不是只有一个Looper,一个MessageQueue

c#中怎样创建消息队列

1..Net使用消息队列,借助windows组件来存储要完成的一系列任务,不用程序使用同一个队列,方便不同程序之间的数据共享和协作……

2.这个在某个方面类似于session(当然还有很多方面不同),相同之处:session可以把信息存储在aspnet_state服务中,网站重新编译或者重新启动网站,session不会丢失(session超时是正常情况,这种情况除外)。

3.win7中安装消息队列组件,详情请百度搜索相关资料。

4.先创建队列,再使用队列,队列中的消息,发送一个多一个,接收一个少一个,先进先出。

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using System.Messaging;//添加物理文件 System.Messaging 的引用namespace testweb{    public partial class MSMQtest : System.Web.UI.Page    {        protected void Page_Load(object sender, EventArgs e)        {            //CreateNewQueue(“MsgQueue“);//创建一个消息队列            //sendSimpleMsg();//每一个队列最好只发送和接收同一种格式的信息,不然不好转换格式。            //receiveSimpleMsg();//            //receiveSimpleMsg();            //sendComplexMsg();            //receiveComplexMsg();            MsgModel m = receiveComplexMsg《MsgModel》();            Response.Write(m.ToString());                    }        private void sendSimpleMsg()        {            //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列            MessageQueue MQ = new MessageQueue(@“.\private$\MsgQueue“);            //MQ.Send(“消息测试“, “测试消息“);            System.Messaging.Message message = new System.Messaging.Message();            message.Label = “消息lable“;            message.Body = “消息body“;            MQ.Send(message);            Response.Write(“成功发送消息,“ + DateTime.Now + “《br/》“);        }        private void receiveSimpleMsg()        {            MessageQueue MQ = new MessageQueue(@“.\private$\MsgQueue“);            //调用MessageQueue的Receive方法接收消息            if (MQ.GetAllMessages().Length 》 0)            {                System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));                if (message != null)                {                    //message.Formatter = new System.Messaging.XmlMessageFormatter(new string { “Message.Bussiness.VideoPath,Message“ });//消息类型转换                    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type { typeof(string) });                    Response.Write(string.Format(“接收消息成功,lable:{0},body:{1},{2}《br/》“, message.Label, message.Body.ToString(), DateTime.Now));                }            }            else            {                Response.Write(“没有消息了!《br/》“);            }        }        private void sendComplexMsg()        {            //实例化MessageQueue,并指向现有的一个名称为VideoQueue队列            MessageQueue MQ = new MessageQueue(@“.\private$\MsgQueue“);            //MQ.Send(“消息测试“, “测试消息“);            System.Messaging.Message message = new System.Messaging.Message();            message.Label = “复杂消息lable“;            message.Body = new MsgModel(“1“, “消息1“);            MQ.Send(message);            Response.Write(“成功发送消息,“+DateTime.Now+“《br/》“);        }        private void receiveComplexMsg()        {            MessageQueue MQ = new MessageQueue(@“.\private$\MsgQueue“);            //调用MessageQueue的Receive方法接收消息            if (MQ.GetAllMessages().Length 》 0)            {                System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));                if (message != null)                {                    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type { typeof(MsgModel) });//消息类型转换                    MsgModel msg = (MsgModel)message.Body;                    Response.Write(string.Format(“接收消息成功,lable:{0},body:{1},{2}《br/》“, message.Label, msg, DateTime.Now));                }            }            else            {                Response.Write(“没有消息了!《br/》“);            }        }        private T receiveComplexMsg《T》()        {            MessageQueue MQ = new MessageQueue(@“.\private$\MsgQueue“);            //调用MessageQueue的Receive方法接收消息            if (MQ.GetAllMessages().Length 》 0)            {                System.Messaging.Message message = MQ.Receive(TimeSpan.FromSeconds(5));                if (message != null)                {                    message.Formatter = new System.Messaging.XmlMessageFormatter(new Type { typeof(T) });//消息类型转换                    T msg = (T)message.Body;                    return msg;                }            }            return default(T);        }        /// 《summary》        /// 创建消息队列        /// 《/summary》        /// 《param name=“name“》消息队列名称《/param》        /// 《returns》《/returns》        public void CreateNewQueue(string name)        {            if (!System.Messaging.MessageQueue.Exists(“.\\private$\\“ + name))//检查是否已经存在同名的消息队列            {                                System.Messaging.MessageQueue mq = System.Messaging.MessageQueue.Create(“.\\private$\\“ + name);                mq.Label = “private$\\“+name;                Response.Write(“创建成功!《br/》“);            }            else            {                //System.Messaging.MessageQueue.Delete(“.\\private$\\“ + name);//删除一个消息队列                Response.Write(“已经存在《br/》“);            }        }    }    [Serializable]    public class MsgModel    {        public string id { get; set; }        public string Name { get; set; }        public MsgModel() { }        public MsgModel(string _id, string _Name)        {            id = _id;            Name = _Name;        }        public override string ToString()        {            if (string.IsNullOrEmpty(id) || string.IsNullOrEmpty(Name)) return ““;            return string.Format(“id--{0},Name--{1}“,id,Name);        }    }}

android messagequeue 什么时候生成的

messagequeue意思是提示框,是安卓手机或电脑要让用户知道某些信息时生成的。›当Windows 10需要让用户知道某些信息时,会自动弹出一个提示框,提示框的标题栏通常显示出本提示信息所针对的操作,提示窗口内则显示出具体信息。›提示框一般至少有一个【确定】按钮,用以退出提示框。当你遇到提示框时,特别是出现错误提示时应当仔细阅读,认真分析,看看是什么原因造成的错误,以免误操作后给工作带来损失,甚至损坏电脑。›此外,功能区里的按钮也对科学高效地操纵电脑非常有用。把鼠标指针移到每个按钮上稍作停留,这个按钮旁边就会出现一个浅色的提示框,说明这个工具按钮的名称。单击这个按钮可执行某项操作,或弹出一个相应的对话框,引导你进行下面的操作。

进程间的通信方式各有什么优缺点

进程间通信IPC------Inter-ProcessCommunication由于内存管理的一些机制,导致两个进程间并不能直接的进行通信(在独立的用户空间),因此我们需要利用一些介质来完成两个进程之间的通信。以下是常用的进程间通信方式。#管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。#有名管道(namedpipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。#信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。#消息队列(messagequeue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。#信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存(sharedmemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。#套接字(socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。进程的亲缘关系通常是指父子进程关系。#有名管道(namedpipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。#信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。#消息队列(messagequeue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。#信号(sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。#共享内存(sharedmemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。#套接字(socket):套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

android:Exception in MessageQueue callback: handleReceiveCallback异常

Tag:MessageQueue-JNIException dispatching input event.Exception in MessageQueue callback: handleReceiveCallbackjava.lang.NullPointerException………………………………………………………………多次触发触摸屏事件,导致对同一个事件处理的消息过多,当第一个消息已处理完事件并销毁事件时,由于该事件已销毁但还没来得及通知销毁第二个同样的消息,当主线程执行第二个消息时,由于获取不了该事件,所以抛出异常。解决:用try..catch..包围onclick事件处理。

怎么在c#中访问messagequeue的死信队列

如何在c#中访问messagequeue的死信队列 我要查看死信队列的消息,然后把符合我的条件的消息重新发回原来队列中,代码如下: /// 《summary》 /// 从死信队列恢复消息到队列 /// 《/summary》 /// 《param name= “prefix “》 《/param》 public static void ReloadFromDeadLetterQueue(string prefix) { prefix = string.Concat( “.private$\\ “, prefix); MessageQueue deadLetterQueue = new MessageQueue(string.Concat(System.Environment.MachineName , @ “\Deadletter$ “)); MessageEnumerator e = deadLetterQueue.GetMessageEnumerator2(); Dictionary 《string, MessageQueue》 messagequeues = new Dictionary 《string, MessageQueue》 (); MessageQueue queue; while (e.MoveNext()) { Message msg = e.Current; string label = msg.Label; if (label.StartsWith(prefix,StringComparison.OrdinalIgnoreCase)) { if (messagequeues.ContainsKey(label)) { queue = messagequeues[label]; } else { queue = new MessageQueue(label);

Microsoft Message Queue是什么!有什么用

MSMQ是Windows自带的标准组件,可以通过控制面板来安装: 添加/删除程序 -》 添加/删除Windows组件,选择MSMQ利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方便地与应用程序进行快速可靠的通信。消息处理为您提供了有保障的消息传递和执行许多业务处理的可靠的防故障方法。 MSMQ与XML Web Services和.Net Remoting一样,是一种分布式开发技术。但是在使用XML Web Services或.Net Remoting组件时,Client端需要和Server端实时交换信息,Server需要保持联机。MSMQ则可以在Server离线的情况下工作,将Message临时保存在Client端的消息队列中,以后联机时再发送到Server端处理。 显然,MSMQ不适合于Client需要Server端及时响应的这种情况,MSMQ以异步的方式和Server端交互,不用担心等待Server端的长时间处理过程。 虽然XML Web Services和.Net Remoting都提供了[OneWay]属性来处理异步调用,用来解决Server端长方法调用长时间阻碍Client端。但是不能解决大量Client负载的问题,此时Server接受的请求快于处理请求。 一般情况下,[OneWay]属性不用于专门的消息服务中。 1. 基本术语和概念( Basic terms and concepts ) “消息”是在两台计算机间传送的数据单位。消息可以非常简单,例如只包含文本字符串;也可以更复杂,可能包含嵌入对象。 消息被发送到队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。 “消息队列”是 Microsoft 的消息处理技术,它在任何安装了 Microsoft Windows 的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。 “消息队列网络”是能够相互间来回发送消息的任何一组计算机。网络中的不同计算机在确保消息顺利处理的过程中扮演不同的角色。它们中有些提供路由信息以确定如何发送消息,有些保存整个网络的重要信息,而有些只是发送和接收消息。 “消息队列”安装期间,管理员确定哪些服务器可以互相通信,并设置特定服务器的特殊角色。构成此“消息队列”网络的计算机称为“站点”,它们之间通过“站点链接”相互连接。每个站点链接都有一个关联的“开销”,它由管理员确定,指示了经过此站点链接传递消息的频率。 “消息队列”管理员还在网络中设置一台或多台作为“路由服务器”的计算机。路由服务器查看各站点链接的开销,确定经过多个站点传递消息的最快和最有效的方法,以此决定如何传递消息。 2. 队列类型( Queue Type ) 有两种主要的队列类型:由您或网络中的其他用户创建的队列和系统队列。 用户创建的队列可能是以下任何一种队列: “公共队列”在整个“消息队列”网络中复制,并且有可能由网络连接的所有站点访问。 “专用队列”不在整个网络中发布。相反,它们仅在所驻留的本地计算机上可用。专用队列只能由知道队列的完整路径名或标签的应用程序访问。 “管理队列”包含确认在给定“消息队列”网络中发送的消息回执的消息。指定希望 MessageQueue 组件使用的管理队列(如果有的话)。 “响应队列”包含目标应用程序接收到消息时返回给发送应用程序的响应消息。指定希望 MessageQueue 组件使用的响应队列(如果有的话)。 系统生成的队列一般分为以下几类: “日记队列”可选地存储发送消息的副本和从队列中移除的消息副本。每个“消息队列”客户端上的单个日记队列存储从该计算机发送的消息副本。在服务器上为每个队列创建了一个单独的日记队列。此日记跟踪从该队列中移除的消息。 “死信队列”存储无法传递或已过期的消息的副本。如果过期或无法传递的消息是事务性消息,则被存储在一种特殊的死信队列中,称为“事务性死信队列”。死信存储在过期消息所在的计算机上。有关超时期限和过期消息的更多信息,请参见默认消息属性。 “报告队列”包含指示消息到达目标所经过的路由的消息,还可以包含测试消息。每台计算机上只能有一个报告队列。 “专用系统队列”是一系列存储系统执行消息处理操作所需的管理和通知消息的专用队列。 在应用程序中进行的大多数工作都涉及访问公共队列及其消息。但是,根据应用程序的日记记录、确认和其他特殊处理需要,在日常操作中很可能要使用几种不同的系统队列。 3. 同步和异步通信( Synchronous VS. Asynchronous Communication ) 队列通信天生就是异步的,因为将消息发送到队列和从队列中接收消息是在不同的进程中完成的。另外,可以异步执行接收操作,因为要接收消息的人可以对任何给定的队列调用 BeginReceive 方法,然后立即继续其他任务而不用等待答复。这与人们所了解的“同步通信”截然不同。 在同步通信中,请求的发送方在执行其他任务前,必须等待来自预定接收方的响应。发送方等待的时间完全取决于接收方处理请求和发送响应所用的时间。 4. 同消息队列交互( Interacting with Message Queues ) 消息处理和消息为基于服务器的应用程序组件之间的进程间通信提供了强大灵活的机制。同组件间的直接调用相比,它们具有若干优点,其中包括: 稳定性 — 组件失败对消息的影响程度远远小于组件间的直接调用,因为消息存储在队列中并一直留在那里,直到被适当地处理。消息处理同事务处理相似,因为消息处理是有保证的。 消息优先级 — 更紧急或更重要的消息可在相对不重要的消息之前接收,因此可以为关键的应用程序保证足够的响应时间。 脱机能力 — 发送消息时,它们可被发送到临时队列中并一直留在那里,直到被成功地传递。当因任何原因对所需队列的访问不可用时,用户可以继续执行操作。同时,其他操作可以继续进行,如同消息已经得到了处理一样,这是因为网络连接恢复时消息传递是有保证的。 事务性消息处理 — 将多个相关消息耦合为单个事务,确保消息按顺序传递、只传递一次并且可以从它们的目标队列中被成功地检索。如果出现任何错误,将取消整个事务。 安全性 — MessageQueue 组件基于的消息队列技术使用 Windows 安全来保护访问控制,提供审核,并对组件发送和接收的消息进行加密和验证。 5. 在 .Net 环境下编写简单的 Message Queue 程序 (1)先安装Message Queuing Services 通过Control Panel,“Add/Remove Programs” – “Add/Remove Windows Components”步骤安装MSMQ。 MSMQ可以安装为工作组模式或域模式。如果安装程序没有找到一台运行提供目录服务的消息队列的服务器,则只可以安装为工作组模式,此计算机上的“消息队列”只支持创建专用队列和创建与其他运行“消息队列”的计算机的直接连接。 (2)配置MSMQ 打开Computer Management – Message Queuing,在Private Queues下创建MSMQDemo队列 (3)编写代码-简单演示MSMQ对象 MessageQueue 类是“消息队列”周围的包装。MessageQueue 类提供对“消息队列”队列的引用。可以在 MessageQueue 构造函数中指定一个连接到现有资源的路径,或者可在服务器上创建新队列。在调用 Send、Peek 或 Receive 之前,必须将 MessageQueue 类的新实例与某个现有队列关联。 MessageQueue 支持两种类型的消息检索:同步和异步。同步的 Peek 和 Receive 方法使进程线程用指定的间隔时间等待新消息到达队列。异步的 BeginPeek 和 BeginReceive 方法允许主应用程序任务在消息到达队列之前,在单独的线程中继续执行。这些方法通过使用回调对象和状态对象进行工作,以便在线程之间进行信息通讯。

什么是消息队列

MSMQ. 这是微软的产品里唯一被认为有价值的东西。对我的客户来说,如果MSMQ能证明可以应对这种任务,他们将选择使用它。关键是这个东西并不复杂,除了接收和 发送,没有别的;它有一些硬性限制,比如最大消息体积是4MB。然而,通过和一些像MassT...

android messagequeue 阻塞会影响性能吗

不影响的。android/framework/base/core/java/android/os/MessageQueue.java android/framework/base/core/java/android/os/Message.java android/frameworks/base/core/jni/android_os_MessageQueue.h android/frameworks/base/core/jni/android_os_MessageQueue.cpp

android主线程中是不是只有一个Looper,一个MessageQueue

Android中的Runnable并不一定是新开的线程,比如下面调用的方法就是运行在UI主线程中Hanlder handler = new Handler();handler.post(new Runnable(){ public void run(){}});官方文档对此的解释是:The runnable will be run on the user interface thread. ”boolean android.view.View .post(Runnable action)Causes the Runnable to be added to the message queue. The runnable will be run on the user interface thread.Parameters: action The Runnable that will be executed. Returns: Returns true if the Runnable was successfully placed in to the message queue. Returns false on failure, usually because the looper processing the message queue is exiting.我们可以通过handler的对象的post方法,把Runnable对象(一般是Runnable的子类)传过去,handler会在Looper中调用Runnable的run方法执行,Runnable是一个接口,不是一个线程,一般线程会实现Runnable接口这里我们看代码handler.post(new Runnable(){好像是new了一个interface,其实是new一个实现Runnable的匿名内部类(Inner Anoymous Class)}) 这是一个简练的方法Runnalbe是一个接口,不是一个线程,一般线程会实现Runnalbe接口,所以如果我们使用匿名内部类是运行在UI主线程的,如果我们使用实现这个Runnable接口的线程类,则是运行在对应的线程的。具体来说这个函数的工作原理如下:View.post(Runnalbe)方法,在post(Runanble action)方法中,View获得当前主线程(即UI线程)的handler,然后将action对象post到handler里面去,在Handler里,它将传递过来的action对象封装成一个Message(Message 的callback为action),然后将其投入到UI线程的消息循环中,在handler再次处理该Message时,有一条分支(未解释的那条)就是为它所设,直接调用runnable的run方法,而此时,已经路由到UI线程里,因此我们可以毫无顾虑来更新UI。如下图,前面看到的代码,我们这里的Message的callback为一个Runnalbe的匿名内部类,这种情况下,由于不是在新的线程中使用,所以千万别做复杂的计算逻辑。

队列

|| 相关文章
    无相关信息
最新文章