मुझे लगता है कि मुझे इसका जवाब पता होना चाहिए, लेकिन अगर मैं संभावित रूप से आपदाजनक गलती कर रहा हूं तो मैं वैसे भी पूछने जा रहा हूं।क्या यह सिग्नल करने के लिए सुरक्षित है और मैन्युअल रीसेट Event बंद करें?
निम्नलिखित कोड निष्पादित करता है कोई त्रुटि/अपवादों के साथ के रूप में उम्मीद:
static void Main(string[] args)
{
ManualResetEvent flag = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(s =>
{
flag.WaitOne();
Console.WriteLine("Work Item 1 Executed");
});
ThreadPool.QueueUserWorkItem(s =>
{
flag.WaitOne();
Console.WriteLine("Work Item 2 Executed");
});
Thread.Sleep(1000);
flag.Set();
flag.Close();
Console.WriteLine("Finished");
}
बेशक
, के रूप में आम तौर पर मल्टी-थ्रेडेड कोड के साथ मामला है, एक सफल परीक्षण साबित नहीं होता कि यह वास्तव में सुरक्षित थ्रेड है। अगर मैं Close
Set
से पहले Close
डालता हूं, तो परीक्षण भी सफल होता है, भले ही दस्तावेज़ स्पष्ट रूप से बताता है कि Close
के बाद कुछ भी करने का प्रयास करने से अपरिभाषित व्यवहार होगा।
मेरा प्रश्न है, जब मैं ManualResetEvent.Set
विधि आह्वान, यह सभी इंतजार कर धागे फोन करने वाले के लिए नियंत्रण लौटने से पहले संकेत करने के लिए गारंटी है? दूसरे शब्दों में, यह मानते हुए कि मैं गारंटी दे सकता हूं कि WaitOne
पर कोई और कॉल नहीं होगी, क्या यह यहां हैंडल को बंद करना सुरक्षित है, या यह संभव है कि कुछ परिस्थितियों में यह कोड कुछ वेटर्स को संकेत या परिणाम प्राप्त करने से रोक देगा ObjectDisposedException
में?
प्रलेखन केवल कहते हैं Set
में एक "राज्य का संकेत" कहते हैं कि - इसके बारे में जब वेटर वास्तव में कि संकेत मिल जाएगा कोई दावा नहीं लगता है, तो मैं सुनिश्चित हो करना चाहते हैं।
स्लीप को वेटऑन() से पहले होने के लिए एक दिलचस्प प्रयोग होगा। इससे आपको यह जांचने की अनुमति मिल जाएगी कि 'ध्वज' बंद होने पर WaitOne() क्या करता है() 'डी। –
@ फिलिप नगन: यह वास्तव में अपरिभाषित है, जैसा कि दस्तावेज़ीकरण से पता चलता है। यदि आप 'थ्रेड स्लीप' से पहले कोड में 'बंद करें' को ले जाते हैं, तो आपको 'WaitOne' के दौरान' ऑब्जेक्ट डिस्प्ले अपवाद '("सुरक्षित हैंडल बंद कर दिया गया है) मिलता है। दूसरी तरफ, यदि आप 'थ्रेड' के बाद सीधे 'बंद करें' * को स्थानांतरित करते हैं, तो दोनों थ्रेड सिग्नल हो जाते हैं और निष्पादन सफलतापूर्वक समाप्त हो जाता है। तो, अपरिभाषित व्यवहार, "खराब" कोड में दौड़ की स्थिति है। मैं बस यह सुनिश्चित करना चाहता हूं कि मेरे पास ऐसा कुछ अपरिभाषित व्यवहार न हो जो मुझे लगता है कि मेरा "अच्छा" कोड है। :) – Aaronaught