के साथ मॉनिटर। ट्राइंटर, मेरे पास एक ऐसी स्थिति है जहां परीक्षण के लिए, मैं केवल एक बार में अपना टाइमर विधि (FooMethod) चलाने के लिए चाहता हूं। नीचे दिए गए उदाहरण में, FooMethod को एक टाइमर के प्रतिनिधि के रूप में पास किया जाता है। इस वर्ग के कई ठोस उदाहरण हैं। मैंने सोचा कि _locker स्थिर बनाकर, FooMethod() का केवल एक उदाहरण एक समय में प्रक्रिया करेगा। लेकिन जब मैं ऐप चलाता हूं, तो कई थ्रेड एक समय में TryEnter() लाइन से पहले हो रहे हैं।जेनेरिक क्लास
इस प्रकार मैं प्रत्येक कक्षा को एक नए टाइमर में जोड़ रहा हूं। यह एक पाश में किया जाता है, प्रत्येक foo उदाहरण के लिए:
_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));
और इस वर्ग कि विधि है कि:
public class Foo<T>
{
private static readonly object _locker = new object();
public void FooMethod(object stateInfo)
{
// Don't let threads back up; just get out
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Logic here
}
finally
{
Monitor.Exit(_locker);
}
}
}
नोट: आम तौर पर, _locker स्थिर नहीं है, मैं पूरा करने का मौका मिलने से पहले एक ही थ्रेड विधि में प्रवेश नहीं करना चाहता हूं। मैंने इसे परीक्षण के लिए स्थिर में बदल दिया।
मेरा पहला विचार यह है कि शायद यह काम नहीं कर रहा है क्योंकि कक्षा सामान्य है? और यह कि प्रत्येक ठोस वर्ग वास्तव में अपनी कक्षा है और वे _locker चर साझा नहीं करते हैं? क्या यह सच है? यदि यह सच है तो मेरे पास ठोस वर्गों को _locker चर साझा करना चाहिए? क्या मुझे किसी अन्य वर्ग में एक स्थिर _locker चर जोड़ने की आवश्यकता है जिस पर फूज़ का उपयोग है?
बहुत ही रोचक और अच्छी तरह से पूछे जाने वाले प्रश्न। +1 – spender
ध्यान दें कि एक ही थ्रेड * एक लॉक फिर से दर्ज कर सकता है (लेकिन केवल तभी कुछ रिकर्सन है)।यही ताले के लिए हैं: एक ही संसाधन का उपयोग करने से * अलग * धागे को रोकना। – phoog
@ स्पेंडर धन्यवाद। और फूग, मैं समझता हूँ। स्थैतिक चर के साथ मेरा लक्ष्य एक ही समय में उस विधि को संसाधित करने से कई धागे को रोकने के लिए था। लेकिन यह काम नहीं कर रहा है। –