gpt4 book ai didi

c# - 无限循环处理 MSMQ

转载 作者:行者123 更新时间:2023-11-30 20:52:27 25 4
gpt4 key购买 nike

我有一个 Winform C# 桌面应用程序。它会调用我的 Web 服务,后者会处理我的上传请求并将其放入 MSMQ。

目前,我正在使用一个基本的 Winform C# 应用程序(安装在我的服务器上)从这个队列中读取并将我的字节数组保存到 .jpegs。

这是代码:

public Form1()
{
InitializeComponent();
string MotionMSMQ = ConfigurationManager.AppSettings["MotionMSMQ"].ToString();
msgQ = new MessageQueue(MotionMSMQ);
}

Thread _th = null;
MessageQueue _msgQ = null;
private void btnStart_Click(object sender, EventArgs e) {
try {
lblStatus.Text = "started";
_th = new Thread(Worker);
_th.Start();
} catch { }
}


private void Worker() {
while (true) {
try {
if (_msgQ.CanRead) {
System.Messaging.Message msgLog = _msgQ.Receive();
using (MemoryStream ms = new MemoryStream()) {
Bitmap newMotionFrame = null;
try {
msgLog.BodyStream.CopyTo(ms);
byte[] msg = ms.ToArray();
//save to stream/jpeg
} catch (Exception processError) {
//handle error
} finally {
if (newMotionFrame != null) {
newMotionFrame.Dispose();
}
}
}
}
}
}
}

不过我注意到了无限循环。这是从 MSMQ 连续读取的唯一/最佳方法吗?

最佳答案

无限循环是可以的,如果它不会白白占用所有 CPU,并且用于只执行一项任务的应用程序(或线程)(例如 Windows 服务或读取的特定后台线程)/写入队列)。

对于消息队列读取的具体情况,我建议使用MessageQueue.Receive接受超时作为参数。这是一个不会消耗 CPU 的阻塞调用(直到队列中有可用消息或达到超时)。您将必须捕获达到超时时抛出的异常。

例子:

MessageQueue messageQueue = ...;
TimeSpan queueReceiveTimeout = ...;

while (true)
{
try
{
Message message = messageQueue.Receive(queueReceiveTimeout);
...
}
catch (MessageQueueException msmqEx)
{
if (msmqEx.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
// Exception handling exceptionally used for normal code flow
// Swallow the exception here
}
else
{
throw;
}
}
}

然后您可以在 while 中使用条件以相对较小的超时(例如5 秒),因此您的服务/线程最多可以在 5 秒内正常停止。

关于c# - 无限循环处理 MSMQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20857545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com