से अधिक का खुलासा किया है मैंने इस त्रुटि को अन्य पदों पर देखा है, लेकिन इस सटीक स्थिति के लिए नहीं।संदेश क्यूई एक बार
मेरे पास दो वर्ग हैं जो MessageQueue के साथ एक ही काम करते हैं। इसके कारण, मैंने एक सहायक वर्ग में कतार के निर्माण और निपटान को सारणित किया। मुझे यह त्रुटि मिल रही है, और मैं नहीं देख सकता कि कतार को एक से अधिक बार कैसे निपटाया जा सकता है।
private MessageQueue _messageQueue;
तब:
वस्तु 'messageQueue' विधि में एक बार 'MsmqHelper.DisposeQueue (MessageQueue)'
वर्गों में से एक में, यह कैसे कतार इस्तेमाल किया जाता है और अधिक से अधिक निपटारा किया जा सकता है , वर्ग के निर्माता में:
this._messageQueue = MsmqHelper.InitializeQueue();
ऐसा नहीं है कि यह वास्तव में मायने रखती है, लेकिन पूर्णता के लिए, यहाँ है, जहां कतार प्रयोग किया जाता है:
+०१२३५१६४१०६this._messageQueue.Send(workflowCreated);
और यहाँ निपटान तरीके हैं:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (disposing == false) { return; }
MsmqHelper.DisposeQueue(this._messageQueue);
}
और यह सहायक वर्ग है कि वास्तव में निपटान कॉल() में कोड है:
public static void DisposeQueue(MessageQueue messageQueue)
{
if (messageQueue != null)
{
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
}
कहाँ कतार के लिए यह संभव है इस स्थिति में एक से अधिक बार निपटान किया जाना है?
** संपादित करें **
मैंने सोचा कि यह यहाँ मेरी टिप्पणी जोड़ने के लिए नीचे दिए गए बातचीत में, अच्छा होगा। स्वीकार्य उत्तर के साथ यह एक अच्छा सारांश है:
मुझे लगता है कि मुझे अब यह मिल गया है। MessageQueue विधि पैरामीटर के पास ऑब्जेक्ट के मूल (this._messageQueue) संदर्भ के साथ कुछ लेना देना नहीं है। तो शून्य के लिए संदेश क्यूई जांचना, और इसे शून्य पर सेट करना, अच्छा नहीं है। कॉलर अभी भी इसके वैरिएबल (this._messageQueue) में डिस्पोजेड होने के बाद भी पास हो सकता है। इसलिए, एक से अधिक बार निपटान करने में सक्षम होने के नाते।
वैसे भी, कॉल करने वाले विधि में यह कॉलर के चर (this._messageQueue) को शून्य तक सेट करने से भी मदद नहीं करता है। समस्या पूरी तरह से MsmqHelper.DisposeQueue() में मौजूद है। तो जवाब रेफरी से गुज़रना है या बस DisposeQueue() को कॉल नहीं करना है और इसे कॉलिंग विधि में करना है।
** संपादित 2 **
इस कोशिश कर के बाद, मैं एक ही त्रुटि मिलती है। मुझे बस यह नहीं मिला।
public static void DisposeQueue(ref MessageQueue messageQueue)
{
if (messageQueue == null) { return; }
messageQueue.Close();
messageQueue.Dispose();
messageQueue = null;
}
** संपादित 3 - बग? **
मुझे लगता है कि यह एक बग हो सकता है। अगर मैं MessageQueue टिप्पणी करता हूं।(), त्रुटि दूर हो जाती है। हालांकि, मैं कॉल संदेश Queue.Close() और messageQueue। विधि पर कॉल करके() को एक साथ जोड़ें। जाओ पता लगाओ। मुझे लगता है कि मैं सिर्फ कॉलिंग विधियों से ये वही कॉल करने जा रहा हूं, या दोनों के बजाय केवल बंद करें() या निपटान() को कॉल करें।
जहां 'सार्वजनिक शून्य निपटान() (बूल निपटान)' विधि परिभाषित किया गया है? – Tigran
क्या यह संभवतः हो सकता है क्योंकि 'बंद करें' और 'निपटान' वही काम करता है? –
@Lasse यह एक दिलचस्प विचार है। मैंने बंद() लाइन पर टिप्पणी की और इसे संकलित किया। तब मैंने बंद() लाइन को असम्बद्ध किया, और निपटान() लाइन पर टिप्पणी की और यह अभी भी संकलित है। तो आपने जो कहा वह जवाब हो सकता है। मैं शपथ ले सकता था कि मेरे पास पिछले कोड में दोनों लाइनें (बंद() और निपटान()) थीं और यह काम करती थी। मैंने अभी जांच की, और मैंने किया। अब मुझे यकीन नहीं है कि क्या सोचना चाहिए। –