1

只是一个小问题,一个列表是否能够存储大量消息。

我的代码是这样的,有 50,000 条队列消息我正在接收并分配给消息列表。

var msgEnumerator = msgQueue.GetMessageEnumerator2();
var messages = new List<System.Messaging.Message>();
while(msgEnumerator.MoveNext(new TimeSpan(0, 0, 1))) {
    var msg = msgQueue.ReceiveById(msgEnumerator.Current.Id, new TimeSpan(0, 0, 1));
    messages.Add(msg);
 }

foreach(var k in messages) {
    MailMessage mailM = (k.Body as SerializeableMailMessage).GetMailMessage();

    try {
        SmtpClient sp = new SmtpClient(smtpip, 25);
        sp.EnableSsl = false;
        sp.Send(mailM);
    }   
    catch (Exception ex) {
        logger.ErrorException("General error sending email.", ex);
    }
}

这是正确的方法,还是有替代方法?让我知道您的建议和帮助!

4

2 回答 2

1

看起来一切都很好......它经常提供多种方法来编程完全相同的东西,但你的已经很不错了;)

我个人更喜欢使用 for 循环,但我知道联盟不是那么高 msmq,所以...

下一级是编写键盘记录器绕过注入或如何调用它......(我希望我没有误解你对这段代码的意图)。

于 2013-10-23T07:23:58.163 回答
0

首先,当您执行 RecieveById 时,您会从队列中删除消息。如果您的软件在读取队列中的所有消息后崩溃,它们就会永远消失。

您应该使用 BeginPeek 并创建事件处理程序 OnPeekCompleted 来处理来自队列的新消息。这样,您一次只处理 1 条消息,并且在读取所有消息然后处理它们时不容易受到此类错误的影响。

private static void Main()
{
    var queue = new MessageQueue("myQueue");
    queue.PeekCompleted += new PeekCompletedEventHandler(OnPeekCompleted);

    // Start listening to queue
    queue.BeginPeek();
}

private void OnPeekCompleted(object sender, PeekCompletedEventArgs e)
{
    var cmq = (MessageQueue)sender;
    try
    {
        var msmqMessage = cmq.EndPeek(e.AsyncResult);

        msmqMessage.Formatter = new XmlMessageFormatter(typeof(messagetypehere));

        var message = msmqMessage.Body;

        // Do logic for the message
        {
            // Send mail or what ever

        }

        cmq.Receive(); // Remove the message from the queue
    }
    catch (Exception ex) 
    {
        // Log or other
    }

    // Refresh queue
    cmq.Refresh();

    // Start listening to queue
    cmq.BeginPeek();
}
于 2013-10-23T07:46:32.333 回答