2014-12-02 2 views
0

У меня возникла проблема с вызовом Close() или Dispose() на MessageQueue. У меня есть приложение, которое должно управлять этими очередями сообщений. Откройте и закройте их.Вызов Close() или Dispose() в MessageQueue ничего не делает

Но когда я звоню Close() или Dispose(), ничего не происходит. Очередь все еще существует на машине. Я использую метод MessageQueue.GetPrivateQueuesByMachine() для получения массива MessageQueue, и он все еще находится там после вызова Close() или Dispose(). После некоторого чтения вокруг кажется, что Dipose() должен быть тем, который я использую, но тем не менее.

Это код, я использую, чтобы попытаться закрыть очередь нужно

public String CloseQueue(String path) 
{ 
    if (GetQueueArray().Length == 0) 
    { 
     return "The Queue Array is Empty!"; 
    } 

    foreach (MessageQueue m in GetQueueArray()) 
    { 
     if (m.Path.Equals(path)) 
     { 
      try 
      { 
       path = m.QueueName; 
       m.Close(); 
       break; 
      } 
      catch (Exception e) 
      { 
       return e.Message; 
      } 
     } 
    } 
    return "Successfully Closed Queue at path: " + path; 
} 

Метод GetQueueArray() определяется как так (в том же классе):

public MessageQueue[] GetQueueArray() 
{ 
    return MessageQueue.GetPrivateQueuesByMachine(machinename); 
} 

Я делаю это только из удобство в моем приложении GUI для вызова этого метода, когда это необходимо.

Как я могу закрыть или избавиться от очередей?

+0

Вы уверены, что это ударил по строке, которая вызывает метод 'Close()'? Вы пробовали обернуть свой код в 'using()' statement? –

+0

'Vipar'' Если класс MessageQueue реализует IDisposable', вы также попробовали просто установить 'm' Object = null; обертывание в 'использование будет также полезно для автоматического удаления'' Выполнение кода' всегда лучше всего в отношении того, чтобы видеть, что ожидаемые строки попадают – MethodMan

+1

Я не уверен, что ваше сообщение точно то, что вы пытаетесь выполнить. Вы говорите, что очередь все еще там. Close и Dispose никогда не удалят очередь с машины. Они представляют собой очереди, созданные на этом компьютере, и ссылаются на ваше приложение для отправки/получения сообщений. Если вы хотите удалить REMOVE с целевой машины, вам нужно будет использовать Delete. См. Ниже: http://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.delete%28v=vs.110%29.aspx, а также ответы nvoigts. – gmiley

ответ

3

Close или Dispose работают только для вашего экземпляра объекта очереди сообщений C#. Они не влияют на реальную очередь сообщений. Точно так же, как удаление соединения с базой данных не будет автоматически удалять всю базу данных с сервера.

Вам необходимо использовать статический метод MessageQueue Delete.

+0

Спасибо, что сделал трюк! :) – OmniOwl

Смежные вопросы