2010-02-22 12 views
5

मैं archetypal FileSystemWatcher समाधान को लागू करने वाला हूं। मेरे पास फ़ाइल निर्माण के लिए निगरानी करने के लिए एक निर्देशिका है, और बनाई गई फ़ाइलों को चूसने और डीबी में डालने का कार्य है। लगभग इसमें 6 या 7, 80 चार टेक्स्ट फाइलें पढ़ने और प्रसंस्करण शामिल होंगी जो कि प्रत्येक दो सेकंड में होने वाली विस्फोटों में 150 एमएस की दर से दिखाई देती हैं, और शायद ही कभी 2 एमबी बाइनरी फाइल को संसाधित करना होगा। यह सबसे अधिक संभावना 24/7 प्रक्रिया होगी।FileSystemWatcher आग के बाद - थ्रेड पूल या समर्पित धागा?

जो मैंने फाइलसिस्टम वाटर ऑब्जेक्ट के बारे में पढ़ा है, उससे बेहतर है कि इसकी घटनाओं को एक थ्रेड में डालें और फिर उन्हें किसी अन्य थ्रेड में निकालें/संसाधित करें। मेरे पास अभी मौजूद विवाद यह है कि प्रसंस्करण करने वाले थ्रेड का बेहतर निर्माण तंत्र क्या होगा। विकल्प मैं देख सकता हैं:

  1. हर बार जब मैं मैं मैन्युअल रूप से एक नया धागा बनाने के एक FSW घटना मिलता है (हाँ मैं जानता हूँ कि .. बेवकूफ वास्तुकला, लेकिन मैं यह कहना था)।

  2. , जब भी मैं एक FSW घटना

  3. शुरू पर मिल थ्रेड पूल CLR पर प्रसंस्करण फेंक प्रसंस्करण के लिए एक समर्पित दूसरा धागा बना सकते हैं और काम संभालने के लिए एक निर्माता/उपभोक्ता मॉडल का उपयोग करें। मुख्य धागा अनुरोध को घेरता है और दूसरा धागा इसे हटा देता है और काम करता है।

मैं वरीय एक के रूप में तीसरी विधि की ओर प्रवृत्त कर रहा हूँ के रूप में मैं जानता हूँ कि काम धागा हमेशा की आवश्यकता होगी - और यह भी शायद और अधिक इसलिए है क्योंकि मैं थ्रेड पूल के लिए कोई महसूस की है।

उत्तर

3

आप कि दूसरी धागा हमेशा की आवश्यकता होगी पता , और आप भी पता कि आप एक से अधिक कार्यकर्ता धागा आवश्यकता नहीं होगी, तो विकल्प तीन काफी अच्छा है।

+1

+1, मैं जोड़ता हूं कि थ्रेड पूल का उपयोग करके कई अनुरोधों पर एक साथ अपने अनुरोधों को आजमाया जाएगा और आपके आवेदन के लिए अच्छी चीज की तरह नहीं लगता है। –

+0

Anon .. मैंने जो परीक्षण किया है, उससे मेरी प्रसंस्करण अच्छी तरह से और सचमुच 150 एमएस में बाइनरी फाइल प्रोसेसिंग के मामले में छोड़ दी जानी चाहिए - जो लगभग 150 एमएस पर चलती है लेकिन ऐसी दुर्लभ घटना होनी चाहिए कि वहां बहुत सारे होंगे चीजें कतारबद्ध होने पर पकड़ने का समय। –

2

बस जागरूक रहें कि FileSystemWatcher घटनाओं को याद कर सकता है, इस बात की कोई गारंटी नहीं है कि यह सभी विशिष्ट घटनाओं को पारित कर देगा। थ्रेड प्राप्त करने वाले कार्यक्रमों द्वारा कम से कम किए गए काम को रखने के आपके डिजाइन को उस घटना की संभावनाओं को कम करना चाहिए, लेकिन यह अभी भी एक संभावना है, सीमित घटना बफर आकार (64 केबी पर ऊपर)।

यदि आप FileSystemWatcher का उपयोग करने का निर्णय लेते हैं तो मैं अत्यधिक यातना परीक्षणों की बैटरी विकसित करने की सलाह दूंगा।

हमारे परीक्षण में, हम नेटवर्क स्थानों के साथ मुद्दों का सामना करना पड़ा, कि InternalBufferSize बदलते का समाधान नहीं होता है, फिर भी जब हम इस परिदृश्य का सामना करना पड़ा है, हम त्रुटि घटना को भी सूचनाएं प्राप्त नहीं किया था।

इस प्रकार, हमने Directory.GetFiles का उपयोग करके ऐसा करने के लिए अपना स्वयं का मतदान तंत्र विकसित किया, इसके बाद पहले प्रदूषित राज्य के साथ लौटाई गई फाइलों की स्थिति की तुलना करके, यह सुनिश्चित करना कि हमारे पास हमेशा एक सटीक डेल्टा था।

बेशक, यह प्रदर्शन में पर्याप्त लागत पर आता है, जो आपके लिए पर्याप्त नहीं हो सकता है।

+1

लियोन, मैं एफएसडब्ल्यू सीमाओं और मुद्दों के बारे में अच्छी तरह से अवगत हूं। यह नेटवर्क शेयरों पर मजबूत नहीं लगता है। मैं केवल स्थानीय निर्देशिका पर उपयोग करने जा रहा हूं और मुझे उम्मीद नहीं है कि एफएसडब्ल्यू इवेंट बफर आकार मुझे समस्याएं पैदा करेगा। अगर मैं कुछ चीजों को याद करता हूं तो मैं एक स्वीपर प्रक्रिया पर योजना बना रहा हूं। –

+0

लियोन .. बीटीडब्ल्यू मैं कई परीक्षणों की योजना बना रहा हूं .. एफएसडब्ल्यू में छिपी हुई गठिया की एक बड़ी संख्या है। –

+0

अगर मैं ऐसा कर रहा था, तो मैं एफएसडब्लू के लिए जाऊंगा, और हर बार और फिर निर्देशिका में एक पूर्ण स्वीप चला सकता हूं (शायद दैनिक, एक बार सिस्टम सामान्य रूप से शांत हो जाता है?) यह सुनिश्चित करने के लिए कि सबकुछ पकड़ा जाए। –

3

तीसरा विकल्प सबसे तार्किक है।

FSW कुछ फ़ाइल घटनाओं लापता के संबंध में, मैं इस कार्यान्वित: 1) FSW वस्तु जो FileCreate 2) tmrFileCheck पर आग, टिक्स = 5000 (5 सेकंड) - कॉल tmrFileChec_Tick

जब FileCreate घटना तब होता है, अगर (tmrFileCheck.Enabled == गलत) तो tmrFileCheck.Start()

इस तरह, 10 सेकंड tmrFileCheck_Tick आग के बाद जो क) tmrFileCheck.Stop() ख) CheckForStragglerFiles

मैंने जो परीक्षण चलाए हैं, यह प्रभावी ढंग से काम करता है जहां < प्रति मिनट बनाई गई 100 फाइलें हैं।

एक संस्करण केवल एक टाइमर टिक एनएन सेकंड है और स्ट्रैग्लर फ़ाइलों के लिए निर्देशिका (ies) को साफ़ करना है।

एक और संस्करण मुझे विंडो को रीफ्रेश करने के लिए F5 दबाए रखने के लिए किराए पर लेना और स्ट्रगलर फ़ाइलों के दौरान आपको कॉल करना है; केवल एक सलाह। :-P

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