Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在MessageQueue上调用Close()或Dispose()不起任何作用_C#_Msmq_Dispose - Fatal编程技术网

C# 在MessageQueue上调用Close()或Dispose()不起任何作用

C# 在MessageQueue上调用Close()或Dispose()不起任何作用,c#,msmq,dispose,C#,Msmq,Dispose,在MessageQueue上调用Close()或Dispose()时遇到问题。我得到了一个应该能够管理这些消息队列的应用程序。打开和关闭它们 但是当我调用Close()或Dispose()时,什么也没有发生。该队列仍存在于计算机上。我使用MessageQueue.GetPrivateQueuesByMachine()方法获取MessageQueue的数组,调用Close()或Dispose()后它仍然在那里。在阅读了一些文章之后,似乎Dipose()应该是我使用的,但仍然是 这是我用来尝试关闭队

MessageQueue
上调用
Close()
Dispose()
时遇到问题。我得到了一个应该能够管理这些消息队列的应用程序。打开和关闭它们

但是当我调用
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()
的定义如下(在同一类中):

我这样做只是为了方便我的GUI应用程序在需要时调用该方法


如何实际关闭或处置队列?

close
dispose
仅适用于消息队列C对象的实例。它们不会影响实际的消息队列。与处理数据库连接不会自动从服务器中删除整个数据库的方式相同


您需要使用MessageQueue的静态方法。

Close
Dispose
仅适用于消息队列C#对象的实例。它们不会影响实际的消息队列。与处理数据库连接不会自动从服务器中删除整个数据库的方式相同


您需要使用MessageQueue的静态方法。

您确定它正在调用
Close()
方法吗?您是否尝试过使用()将代码包装到
语句中?
Vipar
如果MessageQueue类实现了IDisposable
您也尝试过只设置
m
对象=null;使用
包装也有助于自动处理
单步执行代码
对于查看预期行是否已达到目标总是最好的方法。我不确定您的帖子是否确切地说明了您想要实现的目标。你提到队列还在那里。Close and Dispose将永远不会从计算机中删除队列。它们是在该计算机上创建的队列,并从应用程序中引用以发送/接收消息。如果要从目标计算机中实际删除队列,则需要使用Delete。请参阅:以及下面的nvoigts答案。@gmiley nvoigt已使用delete进行了回答。谢谢:)也不要破坏物理队列,这需要更大的武器。请确保确实要这样做,删除队列实际上会保证数据丢失。您永远无法确定在您检索最后一条消息和您断开连接之间是否有另一台机器没有发送消息。或者继续发送消息。这些消息将丢失,这与消息队列应该做的相反。如果您能够承受这样的损失,那么简单的TCP连接就可以了。您确定它正在调用
Close()
方法吗?您是否尝试过使用()将代码包装到
语句中?
Vipar
如果MessageQueue类实现了IDisposable
您也尝试过只设置
m
对象=null;使用
包装也有助于自动处理
单步执行代码
对于查看预期行是否已达到目标总是最好的方法。我不确定您的帖子是否确切地说明了您想要实现的目标。你提到队列还在那里。Close and Dispose将永远不会从计算机中删除队列。它们是在该计算机上创建的队列,并从应用程序中引用以发送/接收消息。如果要从目标计算机中实际删除队列,则需要使用Delete。请参阅:以及下面的nvoigts答案。@gmiley nvoigt已使用delete进行了回答。谢谢:)也不要破坏物理队列,这需要更大的武器。请确保确实要这样做,删除队列实际上会保证数据丢失。您永远无法确定在您检索最后一条消息和您断开连接之间是否有另一台机器没有发送消息。或者继续发送消息。这些消息将丢失,这与消息队列应该做的相反。如果您能够承受这样的损失,那么简单的TCP连接就可以了。
public MessageQueue[] GetQueueArray()
{
    return MessageQueue.GetPrivateQueuesByMachine(machinename);
}