gpt4 book ai didi

c# - MessageQueue.BeginReceive 如何工作以及如何正确使用它?

转载 作者:太空狗 更新时间:2023-10-30 00:21:06 25 4
gpt4 key购买 nike

我目前有一个后台线程。在这个线程中是一个无限循环。

这个循环偶尔更新数据库中的一些值,然后在 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>

来源:https://learn.microsoft.com/en-us/dotnet/api/system.messaging.messagequeue.receivecompleted?view=netframework-4.7.2

关于c# - MessageQueue.BeginReceive 如何工作以及如何正确使用它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7429067/

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