2013-07-19 9 views
5

मेरे पास .NET 4 में लिखा गया एक विंडोज सेवा है जो कई थ्रेड बनाता है जिसमें लूपिंग (चलने) लूप के दौरान असीमित चलती है। जब मैं सेवा को रोकता हूं, तो चलने वाला बुलियन झूठा हो जाता है और हम थोड़ी देर के अंतराल से बाहर निकलते हैं और एक बार प्रत्येक धागा ऐसा करता है, सेवा अंततः बंद हो जाती है।मैं माइक्रोसॉफ्ट सर्विसबस संदेश रिसीवर को कॉल कैसे रद्द कर सकता हूं?

थोड़ी देर के अंदर, यह oMessageReceiver.Receive (TimeSpan.FromSeconds (30)) को कॉल करता है। इसलिए कभी-कभी जब मैं सेवा को रोकने की कोशिश करता हूं, मुझे प्राप्त() प्रक्रिया को टाइमआउट पर 30 सेकंड तक प्रतीक्षा करना पड़ता है।

एक विकल्प 30 सेकंड से कुछ समय के लिए टाइमआउट को कम करना होगा। मुझे यकीन नहीं है कि यह प्रदर्शन दंड कितना होगा, लेकिन चूंकि प्रक्रिया ब्रोकर्ड मैसेज के बिना कोई काम नहीं करती है, वास्तव में मैं श्रोता को जितनी बार संभव हो उतनी देर तक खोलना चाहता हूं।

मुझे लगता है कि MessageReceiver पर एक .BeginReceive() विधि है। मुझे लगता है कि एक प्रोग्रामिंग पैटर्न होगा जो मैं यहां उपयोग कर सकता हूं जो मेरी सेवा को लटकने से रोक देगा जबकि मैं टाइमआउट प्राप्त करने की प्रतीक्षा कर रहा था। क्या कोई वर्णन कर सकता है कि एक असीमित चल रही विंडोज सेवा में स्टार्ट/एंड एपीएम फ़ंक्शंस का उपयोग कैसे करें?

उत्तर

2

संदेश फैक्टरी को बंद करें कि संदेश रिसीवर प्राप्त ऑपरेशन को रद्द करने के लिए बनाया गया था। संदेश कारखाने को बंद करने से पहले संदेश रिसीवर पर एबॉर्ट या क्लोज़ को कॉल करते समय मुझे एक ही समस्या थी।

एसिंक्रोनस प्रारंभ/अंत का उपयोग करने से कोई फर्क नहीं पड़ता। यदि आप असीमित रूप से चलाना चाहते हैं तो एक साइड नोट के रूप में नई एसिंक-प्रतीक्षा सुविधाओं का लाभ उठाने के लिए TaskFactory.FromAsync का उपयोग करके कार्य रैपर बनाने पर विचार करें।

Cancel an Azure Service Bus QueueClient long running Receive?

:

इसके अलावा एक ही समस्या के संबंध में इस प्रश्न पर मेरा उत्तर देखना

4

नए 2.1 विंडोज़ एज़ूर एसडीके में उन्होंने ऑन-मैसेज का उपयोग करने के लिए सर्विस बस वर्कर रोल टेम्पलेट को बदल दिया है जिसे हाल ही में 2.0 एसडीके में पेश किया गया था। आप उस टेम्पलेट पर देख सकते हैं कि यह देखने के लिए कि कौन सा कोड उपयोग करता है। इस दृष्टिकोण में जब कोई संदेश आता है तो आप प्रदर्शन करने के लिए एक क्रिया सेट अप करते हैं। वास्तव में, आप इसे सेट करते समय OnMessageOptions पर MaxConcurrentCalls प्रॉपर्टी भी सेट कर सकते हैं जो आपके लिए आपके अतिरिक्त थ्रेड को संभालेगा। यदि आपने ऑनमेसेज दृष्टिकोण का उपयोग किया है तो आप कुछ ऐसा ही करेंगे जहां सेवा क्यूई क्लाइंट बंद हो जाएगी ताकि यह अब और संसाधित न हो। यदि आप किसी भी धागे पर एक संदेश संसाधित कर रहे थे और केवल उस प्रसंस्करण को पूरा करने के लिए प्रतीक्षा करते हैं, तो आप सिंक्रनाइज़ किए गए संकेतक के साथ भी ट्रैक रख सकते हैं।

एसिंक विधियों (आरंभ/समाप्ति) का उपयोग करने का सबसे अच्छा तरीका के रूप में "Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging" देखें, जिसमें कई उदाहरण हैं।

संबंधित मुद्दे