хочу быстро прочитать сообщение msmq, используя безопасный поток в c # .net - PullRequest
1 голос
/ 11 марта 2011

Я хочу прочитать MSMQ, где данные очереди в байтах и ​​количество очередей, сгенерированных за 1 мин около 1500. так что при непрерывном считывании cpu очереди идет на 30%.и через некоторое время это прекратилось.Мне нужно прочитать очередь в большом объеме до 4 часов .. поэтому я хочу безопасное чтение потока таким образом, чтобы не должно быть блока.на самом деле я не очень хорошо разбираюсь в потоках, так что вы можете помочь мне ..

в настоящее время я читаю таким образом

    bool ProcessStatus; //process
    Thread _UDPthreadConsme;

    private void btn_receive_Click(object sender, EventArgs e)
    {

    if (MessageQueue.Exists(@".\private$\myquelocal"))
    {

    ThreadStart _processrcs = new ThreadStart(receivemessages);
    _UDPthreadConsme = new Thread(_processrcs);
    ProcessStatus = true;
    _UDPthreadConsme.Start();
    }
    }


    private void receivemessages()
    {
    MessageBox.Show("Start");
    while (ProcessStatus)
    {
    try
    {

    // Connect to the a queue on the local computer.
    MessageQueue myQueue = new MessageQueue(@".\private$\myquelocal");


    System.Messaging.Message[] myMessagecount = myQueue.GetAllMessages();

    if (myMessagecount.Length <= 0)
    return;


    myQueue.Formatter = new BinaryMessageFormatter();

    // Receive and format the message.
    System.Messaging.Message myMessage = myQueue.Receive();
    byte[] buffer = (byte[])myMessage.Body;

// here i convert buffer to its related structure and then insert the values in database sqlserver.

}
} 

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Я бы переписал код следующим образом

    private void receivemessages()
    {
        Console.WriteLine("Start");

        MessageQueue myQueue = new MessageQueue(@".\private$\myquelocal");

        while (ProcessStatus)
        {
            try
            {
                // Waits 100 millisec for a message to appear in queue
                System.Messaging.Message msg = myQueue.Receive(new TimeSpan(0, 0, 0, 0, 100));

                // Take care of message and insert data into database

            }
            catch (MessageQueueException)
            {
                // Ignore the timeout exception and continue processing the queue

            }
        }
    }
0 голосов
/ 11 марта 2011

Это пример класса, который запускается на консоли и асинхронно читает очередь.Это самый безопасный и быстрый способ сделать это.Однако обратите внимание, что в зависимости от того, где вы работаете, вам все равно понадобится какой-то механизм блокировки, если вы делаете такие вещи, как обновление текстовых полей с телом сообщения или что-то в этом роде.

public sealed class ConsoleSurrogate {

    MessageQueue _mq = null;

    public override void Main(string[] args) {

        _mq = new MessageQueue(@".\private$\my_queue", QueueAccessMode.Receive);
        _mq.ReceiveCompleted += new ReceiveCompletedEventHandler(_mq_ReceiveCompleted);
        _mq.Formatter = new ActiveXMessageFormatter();
        MessagePropertyFilter filter = new MessagePropertyFilter();
        filter.Label = true;
        filter.Body = true;
        filter.AppSpecific = true;
        _mq.MessageReadPropertyFilter = filter;
        this.DoReceive();

        Console.ReadLine();
        _mq.Close();
    }

    void _mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e) {
        _mq.EndReceive(e.AsyncResult);
        Console.WriteLine(e.Message.Body);
        this.DoReceive();
    }

    private void DoReceive() {
        _mq.BeginReceive();
    }
}
...