मुझे यकीन नहीं है कि लॉगिंग क्लास थ्रेड-सुरक्षित बनाने के बारे में पहले से ही क्या कहा जा रहा है, मैं कुछ भी जोड़ सकता हूं। जैसा कि कहा गया है, ऐसा करने के लिए आपको संसाधन तक पहुंच को सिंक्रनाइज़ करना होगा, यानी लॉग फ़ाइल, ताकि एक ही थ्रेड एक समय में लॉग इन करने का प्रयास कर सके। C# lock
कीवर्ड ऐसा करने का उचित तरीका है।
हालांकि, मैं सिंगलटन दृष्टिकोण (1) को संबोधित करूंगा और (2) उस दृष्टिकोण की उपयोगिता जिसे आप आखिरकार उपयोग करने का निर्णय लेते हैं।
(1) यदि आपका एप्लिकेशन अपने सभी लॉग संदेशों को एक लॉग फ़ाइल में लिखता है, तो सिंगलटन पैटर्न निश्चित रूप से जाने का मार्ग है। लॉग फ़ाइल स्टार्टअप पर खोली जाएगी और शटडाउन पर बंद हो जाएगी, और सिंगलटन पैटर्न पूरी तरह से संचालन की इस अवधारणा को फिट करता है। जैसा कि @ डीटीबी ने इंगित किया है, हालांकि, याद रखें कि एक वर्ग बनाना एक सिंगलटन थ्रेड सुरक्षा की गारंटी नहीं देता है। इसके लिए lock
कीवर्ड का उपयोग करें।
(2) दृष्टिकोण की उपयोगिता का सवाल है, यह सुझाव दिया समाधान पर विचार:
public class SharedLogger : ILogger
{
public static SharedLogger Instance = new SharedLogger();
public void Write(string s)
{
lock (_lock)
{
_writer.Write(s);
}
}
private SharedLogger()
{
_writer = new LogWriter();
}
private object _lock;
private LogWriter _writer;
}
मुझे पहले का कहना है कि इस दृष्टिकोण आम तौर पर ठीक है चलो। यह के एक सिंगलटन उदाहरण को Instance
स्थिर चर के माध्यम से परिभाषित करता है और अन्य को निजी कन्स्ट्रक्टर के आधार पर कक्षा को तुरंत चालू करने से रोकता है। यह सिंगलटन पैटर्न का सार है, लेकिन मैं बहुत दूर जाने से पहले singletons in C# के संबंध में जॉन स्कीट की सलाह पढ़ने और पालन करने की दृढ़ता से अनुशंसा करता हूं।
हालांकि, मैं इस समाधान की उपयोगिता पर ध्यान केंद्रित करना चाहता हूं। 'प्रयोज्यता' से, मैं इस संदेश का लॉग इन करने के लिए इस कार्यान्वयन का उपयोग करने के तरीके का जिक्र कर रहा हूं। पर विचार करें मंगलाचरण कैसा दिखता है:
SharedLogger.Instance.Write("log message");
पूरे 'उदाहरण' भाग सिर्फ गलत लग रहा है, लेकिन वहाँ कोई रास्ता नहीं यह कार्यान्वयन दिया से बचने के लिए है यही कारण है कि।
public static class SharedLogger : ILogger
{
private static LogWriter _writer = new LogWriter();
private static object _lock = new object();
public static void Write(string s)
{
lock (_lock)
{
_writer.Write(s);
}
}
}
सूचना उस वर्ग अब स्थिर है, जिसका अर्थ है अपने सदस्यों और तरीकों के सभी स्थिर होना जरूरी है कि: इसके बजाय, इस विकल्प पर विचार करें। यह पहले के उदाहरण से काफी अलग नहीं है, लेकिन इसके उपयोग पर विचार करें।
SharedLogger.Write("log message");
यह कोड के खिलाफ कोड करना बहुत आसान है।
बिंदु पूर्व समाधान को अस्वीकार नहीं करना है, लेकिन यह सुझाव देने के लिए कि आपके द्वारा चुने गए किसी भी समाधान की उपयोगिता एक महत्वपूर्ण पहलू है जिसे अनदेखा नहीं किया जाना चाहिए। एक अच्छा, उपयोग करने योग्य एपीआई कोड को लिखने के लिए सरल, अधिक सुरुचिपूर्ण और बनाए रखने में आसान बना सकता है।
सिंगलटन पैटर्न थ्रेड-सुरक्षा का संकेत नहीं देता है। – dtb
ध्यान से परिभाषित करके "थ्रेड सुरक्षित" से आपका क्या मतलब है। लोग इस शब्द का उपयोग करते हैं जैसे इसका मतलब कुछ विशिष्ट है, वास्तव में, इसका मतलब यह है कि "परिदृश्य एक्स में सही तरीके से काम करता है"। "सही तरीके से" और एक्स के बारे में एक बयान के बिना, आप वास्तव में कुछ लागू नहीं कर सकते हैं और जानते हैं कि आपने वास्तव में एक समस्या हल की है। –
जोसेफ अल्बाहारी द्वारा [इस महान लेख] (http://www.albahari.com/threading/part2.aspx#_ThreadSafety) देखें। लेख में लगभग आधा रास्ता "थ्रेड सेफ्टी" –