избавиться от try / catch - чтение из очереди сообщений - PullRequest
3 голосов
/ 15 сентября 2011

Как мне изменить следующий блок кода, чтобы он не зависел от блока try / catch и IOTimeout.Эта функция вызывается каждые 1 минуту.поэтому я просто хочу обработать список идентификаторов, которые были поставлены в очередь после последнего вызова this.

Если бы я только получил нулевое значение, когда в очереди не было ожидающих сообщений, это решило бы мою проблему, кромеAPI http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.receive.aspx показывает, что все подписи получения являются синхронными (я не могу заблокировать поток) или с исключениями MessageQueueException, к которым я должен подключиться при помощи блока try / catch.Чего я хотел избежать после прочтения некоторой статьи, предлагающей не использовать try / catch для управления потоком программ.

    #pragma warning disable
    public void ConsumeEvents2()
    {
        var listOfJobs = new List<int>();

        try {
            while (true) { 
                // receive all messages and add in a list to process later
                Message message = messageQueue.Receive(new TimeSpan(0,0,3));
                JobEvent evt = (JobEvent)message.Body;
                listOfJobs.Add(evt.DataNumber);
            }
        } catch (MessageQueueException e) {
            if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout) {
                // process the numbers received
                ProcessJobList(listOfJobs);
                return;
            }
            throw;
        }

    }
    #pragma warning restore

Ответы [ 2 ]

1 голос
/ 15 сентября 2011

попробуйте не получить к нему доступ напрямую, посмотрите на этот код от Microsoft-

using System;
using System.Windows.Controls;
using System.Windows.Messaging;

namespace ReceivingApplication
{
  public partial class Receiver : UserControl
  {
    public Receiver()
    {
        InitializeComponent();

        LocalMessageReceiver messageReceiver =
            new LocalMessageReceiver("receiver",
            ReceiverNameScope.Global, LocalMessageReceiver.AnyDomain);
        messageReceiver.MessageReceived += messageReceiver_MessageReceived;
        try
        {
            messageReceiver.Listen();
        }
        catch (ListenFailedException)
        {
            output.Text = "Cannot receive messages." + Environment.NewLine +
                "There is already a receiver with the name 'receiver'.";
        }
    }

    private void messageReceiver_MessageReceived(
        object sender, MessageReceivedEventArgs e)
    {
        e.Response = "response to " + e.Message;
        output.Text =
            "Message: " + e.Message + Environment.NewLine +
            "NameScope: " + e.NameScope + Environment.NewLine +
            "ReceiverName: " + e.ReceiverName + Environment.NewLine +
            "SenderDomain: " + e.SenderDomain + Environment.NewLine +
            "Response: " + e.Response;
    }
  }
}
0 голосов
/ 15 сентября 2011

В приложениях Windows Forms, когда исключение генерируется где-либо в приложении (в основном потоке или во время асинхронных вызовов), вы можете перехватить его, зарегистрировавшись для события ThreadException в Приложении.Таким образом, вы можете избавиться от добавления try / catch для всех методов.

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod)

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t)
{
    //Exception handling...
}

Событие Application.ThreadException

Для приложений ASP.NET

Чтобы создать глобальный обработчик на странице, создайте обработчик для события System.Web.UI.TemplateControl.Error.Чтобы создать обработчик ошибок всего приложения, в файле Global.asax добавьте код в событие System.Web.HttpApplication.Error .Эти методы вызываются, если в вашей странице или приложении возникает необработанное исключение, соответственно.Вы можете получить информацию о самой последней ошибке из метода GetLastError.

Ниже приведены некоторые интересные темы для вас.

.NET - Каков наилучший способ реализации«Перехватить все обработчики исключений»

Почему метод global.asax Application_Error не перехватывает исключения, выданные службой ASMX?

global.asax Application_Error notстрельба

...