我有一个Windows服务,可以进行一些图像转换。当任何文件(在特定文件夹中)被重命名时(即重命名文件监视程序),它将通过触发来工作。在我将大量图像转储(并重命名)到该文件夹之前,效果很好。 CPU红线等。
因此,我将更改代码以使用 MSMQ 将所有需要转换的文件排队。美好的。每次重命名文件并触发文件查看器时,我便向队列添加一条新消息。 KEWL。
问题是这-> 我如何一次从队列中抓取一封邮件?
我是否需要使计时器对象每xxx秒轮询一次队列?或者有没有办法不断观察队列中的第一个项目。消息存在后,将其提取,处理,然后继续(这意味着,继续窥视直到世界崩溃)。
我想知道是否只需要在Receive方法周围放置一会儿循环。 pseduo代码在下面(在Edit#2中)...
有人对此有任何经验并有建议吗?
谢谢!
编辑:
如果要使用WCF,可以有人提供示例代码等吗?
编辑2:
这是我正在考虑的一些伪代码....
// Windows service start method.
protected override void OnStart(string[] args)
{
// some initialisation stuf...
// Start polling the queue.
StartPollingMSMQ();
// ....
}
private static void StartPollingMSMQ()
{
// NOTE: This code should check if the queue exists, instead of just assuming it does.
// Left out for berevity.
MessageQueue messageQueue = new MessageQueue(".\\Foo");
while (true)
{
// This blocks/hangs here until a message is received.
Message message = messageQueue.Receive(new TimeSpan(0, 0, 1));
// Woot! we have something.. now process it...
DoStuffWithMessage(message);
// Now repeat for eva and eva and boomski...
}
}
最佳答案
如果使用本地队列,则不需要WCF。
这是我的示例服务(Windows服务项目中的服务类别)的外观:
using System.Messaging;
public partial class MQProcessTest1 : ServiceBase
{
//a name of the queue
private const string MqName = @".\Private$\test1";
//define static local private queue
private static MessageQueue _mq;
//lazy local property through which we access queue (it initializes queue when needed)
private static MessageQueue mq
{
get
{
if (_mq == null)
{
if (!MessageQueue.Exists(MqName))
MessageQueue.Create(MqName);
_mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
_mq.Formatter = new BinaryMessageFormatter();
}
return _mq;
}
}
//constructor
public MQProcessTest1()
{
InitializeComponent();
//event to process received message
mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
}
//method to process message
private void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
//queue that have received a message
MessageQueue cmq = (MessageQueue)sender;
try
{
//a message we have received (it is already removed from queue)
Message msg = cmq.EndReceive(e.AsyncResult);
//here you can process a message
}
catch
{
}
//refresh queue just in case any changes occurred (optional)
cmq.Refresh();
//tell MessageQueue to receive next message when it arrives
cmq.BeginReceive();
}
protected override void OnStart(string[] args)
{
//let start receive a message (when arrives)
if (mq != null)
mq.BeginReceive();
//you can do any additional logic if mq == null
}
protected override void OnStop()
{
//close MessageQueue on service stop
if (mq != null)
mq.Close();
return;
}
}
关于.net - MSMQ和轮询以接收消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1198182/