- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前有一个后台线程。在这个线程中是一个无限循环。
这个循环偶尔更新数据库中的一些值,然后在 MessageQueue 上监听 1 秒(使用 queue.Receive(TimeSpan.FromSeconds(1))
)。
只要没有消息进来,这个调用就会在内部抛出一个 MessageQueueException (Timeout) 被捕获,然后循环继续。如果有消息,调用通常会返回并处理消息,然后继续循环。
这会导致 很多 第一次机会异常(每秒一次,除非有一条消息要处理),这会向调试输出发送垃圾邮件,并且当我忘记排除 MessageQueueExceptions 时还会中断调试器。
那么,如何正确完成 MessageQueue 的异步处理,同时仍然确保,只要我的应用程序在运行,队列就会受到监控并且数据库也会偶尔更新一次。当然这里的线程不应该占用100%的CPU。
我只需要大图或一些正确完成的异步处理的提示。
最佳答案
与其在线程中循环,我建议为 MessageQueue 的 ReceiveCompleted 事件注册一个委托(delegate),如下所述:
<p>using System;
using System.Messaging;</p>
<p>namespace MyProject
{
///
/// Provides a container class for the example.
///
public class MyNewQueue
{</p>
<pre><code> //**************************************************
// Provides an entry point into the application.
//
// This example performs asynchronous receive operation
// processing.
//**************************************************
public static void Main()
{
// Create an instance of MessageQueue. Set its formatter.
MessageQueue myQueue = new MessageQueue(".\\myQueue");
myQueue.Formatter = new XmlMessageFormatter(new Type[]
{typeof(String)});
// Add an event handler for the ReceiveCompleted event.
myQueue.ReceiveCompleted += new
ReceiveCompletedEventHandler(MyReceiveCompleted);
// Begin the asynchronous receive operation.
myQueue.BeginReceive();
// Do other work on the current thread.
return;
}
//**************************************************
// Provides an event handler for the ReceiveCompleted
// event.
//**************************************************
private static void MyReceiveCompleted(Object source,
ReceiveCompletedEventArgs asyncResult)
{
// Connect to the queue.
MessageQueue mq = (MessageQueue)source;
// End the asynchronous Receive operation.
Message m = mq.EndReceive(asyncResult.AsyncResult);
// Display message information on the screen.
Console.WriteLine("Message: " + (string)m.Body);
// Restart the asynchronous Receive operation.
mq.BeginReceive();
return;
}
}
</code></pre>
<p>}</p>
关于c# - MessageQueue.BeginReceive 如何工作以及如何正确使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429067/
我在其他帖子上看到过这个错误,但不是针对这种情况。 我有两个类使用 MessageQueue 做同样的事情。因此,我将队列的创建和处理抽象为一个辅助类。我遇到了这个错误,而且我看不出如何多次处理队列。
我还有两个问题。1. 如何将消息队列名称作为命令行参数传递?例如我写道: char src[50] , dest[50]; strcpy(src , "/"); strcpy(dest , argv[
据我了解,如果 MessageQueue 中只有带有 future 时间戳的消息,则 MessageQueue 会阻塞 Looper 的循环直到那个时间到来。但如果 MessageQueue 完全为空
我一直在浏览有关消息队列的文档,但似乎找不到我正在寻找的信息。我想要完成的任务是在每次调用 MySQL 数据库过程时记录该过程的名称,以便跟踪每个过程的调用频率。我的想法是在调用时将名称记录到 Mes
我一直在查看处理来自 MSMQ 的消息的服务的示例代码。在代码中,在 ReceiveCompletedEventHandler 的开头立即调用 EndReceive() 方法,然后它开始实际处理消息的
我只想在异步方法中接收我的消息!它卡住了我的用户界面 public async void ProcessMessages() { MessageQueue MyMess
我目前有一个后台线程。在这个线程中是一个无限循环。 这个循环偶尔更新数据库中的一些值,然后在 MessageQueue 上监听 1 秒(使用 queue.Receive(TimeSpan.FromSe
我用 C# 编写的应用程序使用 .NET 中的 MessageQueue 类与另一个远程应用程序进行消息通信,MessageQueue 应始终与远程 messageQueue 在所有情况下“连接”(存
我想先将一个类添加到 MessageQueue 的 MessageContent,然后再将其添加到 QueueStorage。 示例 class udpates { public int us
我正在调试 Android 框架,Handler 处理消息的速度很慢,所以我也许应该检查 Handler 的 MessageQueue 以查看消息是否具有低优先级或队列太长。 我查看了 Handler
我在使用基本的 Microsoft Message Queue 实现时遇到以下问题: 在读取端,消息的 Formatter 属性始终为 null,无论我在发送端输入什么。 发送代码: System.M
我发布这个问题是因为我想知道我对基础知识的想法是否正确。 应该清楚的是,UI-Thread 包含一个 MessageQueue,它与一个 Looper 相关联,以从队列中获取消息/可运行对象以进行处理
我已取消选择在专用队列上发送消息的权限,但 MessageQueue.CanWrite 从未返回 false。我可以切换接收消息权限,并且 CanRead 属性会按预期响应。为什么 CanWrite
我想在 MSMQ 消息队列上使用 Linq。据我所知,我需要将消息队列转换为 IEnumerable Howerver var queryableQ = new MessageQueue(myQueu
我正在使用 PeekCompleted 从 MessageQueue 中读取消息,我在这里执行我的过程,如果一切正常,我需要将其从队列中删除!目前我正在使用 MyMessageQueue.Receiv
我使用以下代码发送消息: var transaction = new MessageQueueTransaction()) transaction.Begin( ); var message = n
这个问题在这里已经有了答案: 关闭 13 年前。 Possible Duplicate: Java and MSMQ 我有一个由另一个组编写的 windows/C# 进程,它将 xml 格式的消息泵
我正在使用 Philip Semanchunk 的 posix_ipc python 模块从 posix 消息队列中读取数据。我编写的 C++ 程序使用包含数据的结构填充队列。我的 python 程序
我目前遇到丢失消息的问题。此错误很少发生,但经常发生,足以令人厌烦。以下是问题的背景: 我已经在 goldmine_service_queue 上打开了消息日志,它是 Windows 2003 服务器
我如何判断一个远程消息队列exists ?文档指出“存在”方法不适用于远程机器。 以下无效(我知道队列路径是准确的,因为我能够将消息发送到队列): if (!MessageQueue.Exists(@
我是一名优秀的程序员,十分优秀!