2012-02-06 17 views
9

मेरे पास एक नेटवर्क सिस्टम पर फ़ाइल की निगरानी करने वाला एक फ़ाइल सिस्टम सिस्टम है। यदि शेयर अनुपलब्ध बनाने के लिए कोई ईवेंट होता है, तो शायद नेटवर्क समस्या के कारण, FileSystemWatcher डिस्कनेक्ट हो जाता है।फाइलसिस्टम वाटर नेटवर्क डिस्कनेक्ट

स्पष्ट रूप से मैं "त्रुटि" घटना को संभाल सकता हूं, शायद कुछ लॉगिंग कर सकता हूं और कई लेख त्रुटि ईवेंट हैंडलर के अंदर एफएसडब्ल्यू को दोबारा जोड़ने का सुझाव देते हैं।

लेकिन क्या होगा यदि त्रुटि साझा करने के दौरान नेटवर्क शेयर अभी भी अनुपलब्ध है। मुझे नेटवर्क टाइगर उपलब्ध होने और एफएसडब्ल्यू को दोबारा जोड़ने का प्रयास करने के लिए परीक्षण करने के लिए टाइमर पेश करने की आवश्यकता है।

1) क्या कोई बेहतर दृष्टिकोण है?

2) क्या कोई ऐसी संपत्ति है जो मुझे यह निर्धारित करने की अनुमति देती है कि एफएसडब्ल्यू फाइल से डिस्कनेक्ट हो गया है? मुझे लगता है कि एफएसडब्लू "स्टॉप लिस्टिंग" का एक गैर-सार्वजनिक सदस्य है, जो एफएसडब्ल्यू डिस्कनेक्ट होने पर सत्य पर सेट होता है। लेकिन इस सार्वजनिक रूप से

किसी भी मदद की सराहना की जाएगी संपर्क में नहीं है ...

धन्यवाद केविन

+0

संभव डुप्लिकेट [FileSystemWatcher और नेटवर्क डिस्कनेक्ट?] (http://stackoverflow.com/questions/281573/filesystemwatcher-and-network-disconnect) –

+0

प्रतिक्रिया एर्नो के लिए धन्यवाद, लेकिन कोई यह नहीं है। मुझे पता है कि मैं फिर से कनेक्ट करने के लिए त्रुटि घटना का उपयोग कर सकता हूं। लेकिन जब त्रुटि घटना उठाई जाती है तो क्या होता है यदि नेटवर्क शेयर अनुपलब्ध है? जब तक कि मेरे पास फिर से कनेक्ट करने के लिए टाइमर/समयबद्ध प्रयास का कोई प्रकार न हो, मेरे पास फिर से कनेक्ट करने का प्रयास करने के लिए कोई अन्य ईवेंट नहीं है! इसके अलावा, एफएसडब्ल्यू सार्वजनिक संपत्ति का पर्दाफाश नहीं करता है यह बताने के लिए कि यह –

+0

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

उत्तर

1

इसमें अनुवर्ती। एमएसडीएन मंचों पर माइक्रोसॉफ्ट संसाधन के सुझाव पर, मैंने इसे माइक्रोसॉफ्ट कनेक्ट में जोड़ा।

Microsoft से प्रतिक्रिया से मुख्य बिंदु: - त्रुटि घटना है न केवल आंतरिक बफर के लिए overflows - वे ग्राहक सुझाव की अपनी सूची

लिंक यहाँ के stopListening संपत्ति उजागर करने की संभावना जोड़ देगा: http://connect.microsoft.com/VisualStudio/feedback/details/727934/filesystemwatcher-error-handling

+0

पृष्ठ अब उपलब्ध नहीं है या इसे देखने की अनुमति नहीं है - उत्तर को बेकार प्रदान करता है :( – Darren

7

टिप्पणियों और सुझावों के एक जोड़े ... (जो बड़ा हुआ और बड़ा हुआ के रूप में मैं टाइप किया गया था ... क्षमा करें)

फ़ाइलसिस्टम वाटर.इरर ईवेंट निकाल दिया जाता है जब फ़ाइलसिस्टम वाचर को इतनी जल्दी घटनाएं होती हैं कि यह उन सभी को संभाल नहीं सकती है। यह फ़ाइल सिस्टम को देखने में कोई त्रुटि उत्पन्न होने पर निकाल दिया जाता है (जैसे नेटवर्क ड्रॉप आउट)।

मेरा मानना ​​है कि मेरे पास एक समान स्थिति है। समस्या यह है कि जब नेटवर्क कनेक्शन समाप्त हो जाता है, तो FileSystemWatcher का कोई ईवेंट ट्रिगर नहीं होता है, क्योंकि यह वास्तव में यह नहीं देख सकता कि यह क्या देखना चाहिए, लेकिन यह इस तथ्य से अवगत नहीं है। जब नेटवर्क कनेक्शन वापस आता है, तो FileSystemWatcher पुनर्प्राप्त नहीं होता है - यानी यह अभी भी (पुनर्स्थापित) कनेक्शन नहीं देख सकता है। एकमात्र समाधान जो हम उसके साथ आए थे, वह भरोसेमंद काम करना प्रतीत होता था कि एक टाइमर होता है जो नियमित रूप से पूरे फाइलसिस्टम वाटर ऑब्जेक्ट को छोड़ देता है और सभी घटनाओं को सेट करता है और फ़ोल्डर देखता है आदि। एक नया फाइल सिस्टम सिस्टम छोड़ने और बनाने के बाद (अपेक्षाकृत) त्वरित (यानी मिलीसेकंड) आप टाइमर को हर 10 सेकंड या फिर प्रोसेसर का उपयोग किए बिना सक्रिय करने के लिए सेट कर सकते हैं। बेशक, यदि नेटवर्क अभी भी बाहर है, तो FileSystemWatcher नेटवर्क को देखने में सक्षम नहीं होगा, इससे कोई फर्क नहीं पड़ता कि आप क्या करते हैं। लेकिन यह ठीक है, यह फिर से 10 सेकंड में कोशिश करेगा।

दो बातें इस समाधान के साथ के लिए बाहर देखने के लिए:

  1. जब टाइमर को सक्रिय करता है, तो वह उस FileSystemWatcher वर्तमान में किसी भी घटनाओं प्रसंस्करण नहीं है की जाँच करने की जरूरत है, और यह अगर यह होता है प्रतीक्षा करने के लिए की जरूरत है। तो टाइमर ईवेंट में, टाइमर को रोकें, फाइल सिस्टम सिस्टम को घटनाओं को बढ़ाने से रोकें, फिर किसी भी फाइलसिस्टम वाटर घटनाओं को समाप्त करने के लिए प्रतीक्षा करें (लॉक (...) {...} का उपयोग करने का एक अच्छा तरीका है)।
  2. FileSystemWatcher को छोड़ने और पुनर्निर्माण करने के बाद, आपको फ़ाइल सिस्टम सिस्टम को रीफ्रेश किया जा रहा था (या नेटवर्क नीचे होने पर) होने पर होने वाली किसी भी घटना के लिए मैन्युअल रूप से जांचना होगा। उदाहरण के लिए, यदि आप फाइलों के निर्माण के लिए देख रहे हैं, और फ़ाइल सिस्टम सिस्टम को रीफ्रेश करते समय या नेटवर्क कनेक्शन समाप्त होने पर फ़ाइल बनाई जाती है, तो जब आप FileSystemWatcher का नया उदाहरण शुरू करते हैं तो आपको उन फ़ाइलों के लिए ईवेंट नहीं मिलेंगे (चूंकि फाइलें पहले ही बनाई जा चुकी हैं)।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

प्रतिक्रिया मार्क के लिए धन्यवाद। एमएसडीएन दस्तावेज़ को दोबारा पढ़ने के बाद, मैं देखता हूं कि आप सही हैं, फ़ाइल सिस्टम को देखने में त्रुटि होने पर त्रुटि घटना वास्तव में निकाल दी जाती है, जो कि मेरे हिस्से पर गलत समझ थी। –

+1

आपका दृष्टिकोण दिलचस्प है, हालांकि (शायद डिज़ाइन दोष के कारण), फ़ाइलसिस्टम वाटर वास्तव में एक उच्च मात्रा WCF सेवा के अंदर एक स्थिर है। इसलिए, हर 10 सेकंड में इसे फिर से शुरू करने की अवधारणा शायद हमारे लिए एक विकल्प नहीं है, यहां तक ​​कि थोड़ा सा प्रदर्शन हिट हमारे आवश्यक प्रतिक्रिया समय के लिए महंगा हो सकता है। ऐसा लगता है कि कोई जवाब नहीं है, क्योंकि हम पूरी तरह से त्रुटि घटना पर भरोसा नहीं कर सकते हैं, इष्टतम समाधान फ़ाइलसिस्टम वाटर को हटाने के हमारे समाधान को पुन: कारक बनाना होगा क्योंकि यह अविश्वसनीय दृष्टिकोण प्रतीत होता है। –

0

इस काम को कुछ नहीं चाहिए? मेरे सरल परीक्षण मामले के लिए काम करने लगता है। की

var fsw = new FileSystemWatcher("[folder]", "*.*") { IncludeSubdirectories = true}; 
var fsw_processing = false; 
fsw.Deleted += (s, e) => 
{ 
    fsw_processing = true; 
    fsw.EnableRaisingEvents = false; 
    //...... 
    fsw.EnableRaisingEvents = true; 
    fsw_processing = false; 
};  
fsw.Changed += (s, e) => 
{ 
    fsw_processing = true; 
    fsw.EnableRaisingEvents = false; 
    //...... 
    fsw.EnableRaisingEvents = true; 
    fsw_processing = false; 
};  
//governor thread to check FileSystemWatcher is still connected. 
//It seems to disconnects on network outages etc. 
Task.Run(() => 
{ 
    while (true) 
    { 
     if (fsw.EnableRaisingEvents == false && fsw_processing == false) 
     {       
      try 
      {fsw.EnableRaisingEvents = true;} 
      catch (Exception) { fsw.EnableRaisingEvents = false; }    
     } 
     System.Threading.Thread.Sleep(1000 * 10);//sleep 10 secs 
    } 
}); 
संबंधित मुद्दे