खैर ... आप ब्लॉक करने के लिए मुख्य थ्रेड पीठ पर सब सेमाफोर काउंटरों छीन कर सकते हैं क्रम में जब गिनती 0 है, बजाय गैर शून्य।
संशोधित: यहाँ मैं 3 चीजें ग्रहण:
- कार्यक्रम चल रहा हो, एक नया डाउनलोड काम किसी भी समय शुरू हो सकता है।
- कार्यक्रम से बाहर निकलने पर, कोई और नया डाउनलोड नहीं होगा जिसकी देखभाल की आवश्यकता है।
- कार्यक्रम बाहर निकलने पर, आप तो यहाँ
डाउनलोड करने समाप्त करने के लिए सभी फ़ाइलों के लिए प्रतीक्षा करने की आवश्यकता मेरी समाधान, संशोधित है:
एक बड़ा पर्याप्त काउंटर के साथ सेमाफोर आरंभीकृत ताकि आप कभी नहीं प्रवेश अधिकतम (यह केवल 100 या सिर्फ 10 अपनी स्थिति के आधार पर किया जा सकता है):
var maxDownloads = 1000;
_semaphore = new Semaphore(0, maxDownloads);
फिर प्रत्येक डाउनलोड पर
, ताकि बाहर निकलने कार्यक्रम की स्थिति में, कोई डाउनलोड शुरू कर सकते हैं डाउनलोड शुरू करने से पहले WaitOne() के साथ शुरू होता । घटना "बाहर निकलें", सेमाफोर पर सभी काउंटरों ऊपर की खपत पर
finally { _semaphore.Release(1); }
और फिर:
if (_semaphore.WaitOne())
/* proceeds with downloads */
else
/* we're terminating */
डाउनलोड पूरा होने पर
फिर एक काउंटर जारी (अगर हम एक का अधिग्रहण किया था):
for (var i = 0; i < maxDownloads; i++)
_semaphore.WaitOne();
// all downloads are finished by this point.
...
इस गंध पर लॉकिंग मजेदार –
@ ओरी: वह क्यों है? एमएसडीएन का कहना है कि यह करने का एक आम तरीका है: http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx – mpen
@ मार्क: प्राचीन दस्तावेज़ीकरण का उपयोग करने के बारे में बहुत सावधान रहें। आपका पृष्ठ .NET 1.1 संस्करण था, जब हम बेहतर नहीं जानते थे। Http://msdn.microsoft.com/en-us/library/c5kehkcz.aspx देखें। –