Пример #1
0
        protected override void Read()
        {
            using (var reader = new StreamReader(_fileName))
            {
                // Similar to EventMessages.ReadOuterXml(), but send the messages to the handler as we
                // read them.

                var adaptor = new XmlReadAdaptor(new XmlTextReader(reader), Xml.Namespace);

                if (adaptor.IsReadingElement(Xml.EventMessagesElement))
                {
                    var messages = new EventMessages();

                    while (adaptor.ReadElement(Xml.EventMessageElement))
                    {
                        // Check the reader wait handles - should we stop or pause?

                        if (StopEvent.WaitOne(0, false))
                        {
                            return;
                        }

                        if (PauseEvent.WaitOne(0, false))
                        {
                            // Paused - wait for stop or continue.

                            var pauseHandles = new[] { StopEvent, ContinueEvent };
                            switch (WaitHandle.WaitAny(pauseHandles))
                            {
                            case 0:
                                return;                                         // Stop.

                            case 1:
                                break;                                         // Continue.
                            }
                        }

                        var message = new EventMessage();
                        message.ReadXml(adaptor.XmlReader);
                        adaptor.ReadEndElement();

                        // Send to the message handler, if we have enough.

                        messages.Add(message);

                        if (messages.Count == Constants.MessageComponents.EventFile.MessageReaderBatchSize)
                        {
                            HandleEventMessages(messages);
                            messages = new EventMessages();
                        }
                    }

                    // Send any remaining messages to the message handler.

                    if (messages.Count > 0)
                    {
                        HandleEventMessages(messages);
                    }
                }
            }

            OnExistingMessagesRead(System.EventArgs.Empty);
        }