2012-11-08 20 views
9

डरने से पहले मुझे जवाब पता है। मेरे पास एक कक्षा है जो सेवाएं कॉल और कैशिंग को संभालती है। उसी अनुरोध के साथ सेवा में कई कॉल से बचने के लिए, मैं निश्चित रूप से कोड के आसपास लॉक का उपयोग कर सकता हूं लेकिन इनमें से बहुत से तरीकों में अलग-अलग तर्क होते हैं जो कैश कुंजी बनाते हैं। लॉक कोड ब्लॉक को निष्पादित करने के लिए प्रतीक्षा करना शर्म की बात है जब यह एक पूरी तरह से अलग कैश कुंजी (या एकाधिक अलग कैश कुंजी) के लिए हो सकता है।सी # लॉक करने या लॉक करने के लिए

मुझे पता है कि मैं कैश कुंजी स्ट्रिंग पर लॉक कर सकता हूं लेकिन यह कोई संख्या नहीं है कि वह स्ट्रिंग संभावित रूप से कहीं भी पॉप अप हो सकती है।

तो, मैं या तो लॉक के बिना सेवा के लिए संभावित अनावश्यक कॉल कर सकता हूं या लॉक की प्रतीक्षा करके विधि के भीतर संभावित अनावश्यक देरी जोड़ सकता हूं।

क्या वे मेरे केवल 2 विकल्प हैं या कोई और है?

चीयर्स

+3

"उसी अनुरोध के साथ सेवा में एकाधिक कॉल से बचने के लिए, मैं निश्चित रूप से लॉक का उपयोग कर सकता हूं" - यह सही से कम लगता है। एक ताला (System.Threading.Monitor.Enter/Exit) कोड के ब्लॉक को चिह्नित करने के लिए प्रयोग किया जाता है जो केवल एक दिए गए ताले के लिए केवल एक थ्रेड द्वारा चलाया जाएगा। यह जादुई रूप से बार-बार कॉल गायब नहीं होगा। कृपया कोड का एक टुकड़ा पोस्ट करें कि उत्तर पर आधारित हो सकता है। – Tar

+0

@ default.kramer आप ऐसा कर सकते हैं, लेकिन आपको उन ऑब्जेक्ट्स या कुछ समान शब्दकोश का एक शब्दकोश होना चाहिए, ताकि आप इसे फिर से एक और स्ट्रिंग दे सकें। आपको सावधान रहने की भी आवश्यकता है कि आपको लॉक करने की आवश्यकता के निर्धारण के लिए अपना तर्क केवल सब कुछ लॉक करने से अधिक समय/प्रयास नहीं करता है (जो विशिष्ट उपयोग मामलों पर स्वाभाविक रूप से निर्भर करेगा)। – Servy

उत्तर

7

आप कर सकते थे, संभावित, अपने प्रकार के चारों ओर इस तरह के एक ConcurrentDictionary<T,U> के रूप में एक धागा सुरक्षित वर्ग, उपयोग करने के लिए, अपने कैशिंग को संभालने के लिए स्विच करें। उचित रूप से उपयोग किया जाता है, यह लॉकिंग (स्वयं के) की आवश्यकता को रोक देगा, क्योंकि आप समवर्ती संग्रह में बने ठीक दाग लॉकिंग पर भरोसा कर सकते हैं।

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