2012-01-06 19 views
11

मैं एक समाधान लिख रहा हूं जहां मैं कुछ कॉन्फ़िगरेशन फ़ाइलों का उपयोग करता हूं जो रनटाइम पर संपादन योग्य होना चाहिए। मैं इस उद्देश्य के लिए FileSystemWatcher का उपयोग कर रहा हूं और इससे पहले कभी भी इसमें कोई समस्या नहीं थी लेकिन अब यह 'नाम बदलें' घटना पर सीटीडी का कारण बन रहा है।FileSystemWatcher डेस्कटॉप पर क्रैश का कारण बनता है

private static int _s_renamed; 
private static int _s_created; 
private static int _s_errors; 

private static void monitorConfiguration(string configRootFolder) 
{ 
    var fsw = new FileSystemWatcher(configRootFolder, ConfigFilePattern) 
    { 
     NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName, 
     IncludeSubdirectories = false 
    }; 
    fsw.Renamed += (sender, args) => ++_s_renamed; // <-- ! CTD efter this one ! 
    fsw.Created += (sender, args) => ++_s_created; 
    fsw.Error += (sender, args) => ++_s_errors; 
    fsw.EnableRaisingEvents = true; 
} 

दुर्घटना FileSystemWatcher ऐसा लगता है से आता है:

यह (बेकार) कोड का टुकड़ा मेरी सेटअप में समस्या को पुन: होगा। यदि मैंने FileSystemWatcher.Renamed के लिए ईवेंट हैंडलर में ब्रेकपॉइंट सेट किया है तो यह हिट हो जाता है लेकिन जब मैं इससे बाहर निकलता हूं तो ऐप क्रैश हो जाता है। यदि मैंने FileSystemWatcher.Created ईवेंट हैंडलर में ब्रेकपॉइंट सेट किया है तो ऐसा नहीं होता है।

कोई सुझाव?


संपादित करें 1: मैं एक विंडोज 7 x64 पर .NET 4 चल रहा हूँ (अंतिम) मंच मैं कई समस्याओं के इस प्रकार के विषय में विचार विमर्श देखा है लेकिन सभी लोगों को यूआई सामान अपडेट करने का प्रयास करने के लिए संबंधित कर दिया गया है (जो मुख्य/यूआई थ्रेड से किया जाना चाहिए) ईवेंट हैंडलर से। यही कारण है कि मैं प्रयोगात्मक कोड में कुछ काउंटर बढ़ाने की कोशिश करता हूं।

+2

वहाँ एक अपवाद है? – David

+0

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

+0

सीटीडी क्या है और यह क्या करता है? – Gabe

उत्तर

1

बस स्पष्ट करने के लिए:

समस्या यहाँ मैं और अधिक/FileSystemWatcher के पुराने उपभोक्ताओं था कहीं और अपने सिस्टम में किया गया था और उनमें से एक एक क्रिया का अपवाद उत्पन्न। समस्या यह है कि अपवाद पूरी तरह से अलग थ्रेड में फेंक दिया जाता है और एप्लिकेशन को डेस्कटॉप पर क्रैश करने का कारण बनता है। समय ने मुझे यह सोचने में बेवकूफ बना दिया कि यह मेरा नया उपभोक्ता था जो किसी भी तरह से इस तरह का कारण बनता था, लेकिन जब मैंने क्रिस शाइन की सलाह का पालन किया (प्रश्न प्रविष्टि में टिप्पणियां देखें) अपवादों पर ब्रेक को सक्षम करने के लिए (msdn.microsoft.com/en-us/library/d14azbfh.aspx) मुझे तुरंत असली अपराधी मिला।

मैं क्रिस को समाधान के साथ श्रेय देना पसंद करता था लेकिन उसने कभी भी फिर से पोस्ट नहीं किया है।उम्मीद है कि हमने कुछ सीखा है।

सभी को धन्यवाद और खुश कोडिंग

/जोनास

0

आप इन तीन स्थितियों

  1. निर्देशिका में पारित कर दिया में से किसी में चल रहा हो सकता है मौजूद नहीं है और एक फ़ाइल कब नहीं मिला फेंक दिया जा रहा है।
  2. पास की गई निर्देशिका मान्य है लेकिन इसे चलाने की प्रक्रिया में एक्सेस अधिकार नहीं हैं
  3. तर्क (प्रेषक, तर्क) पास किए गए अनुसार, कोई शून्य और आपका कोड हो सकता है (क्योंकि यह एक उदाहरण है और हम ' असली कोड नहीं देखते हैं) शून्य को संभालने और त्रुटि को फेंक नहीं रहा है।
0

.NET में आपको UI थ्रेड के साथ FileSystemWatcher द्वारा जेनरेट किए गए थ्रेड को सिंक करना होगा। इसके लिए, यूआई नियंत्रणों में इस विधि के लिए एक तरीका है: myControl.Invoke (...)। किसी अन्य तरीके से सिंक करने के लिए crashs, अपवाद, आदि जैसे कुछ यादृच्छिक प्रभाव होगा की कोशिश करने

यहाँ देखें: http://msdn.microsoft.com/en-us/magazine/cc300429.aspx http://weblogs.asp.net/justin_rogers/pages/126345.aspx

हो सकता है कि आपकी फ़ाइल या वस्तु उपयोग में हैं आशा है कि यह

0

में मदद करता है, मैं एक ऐसी ही समस्या थी और मैं निम्नलिखित कोड

private void InitWatch() 
{ 
    FileSystemWatcher watcher = new FileSystemWatcher(); 
    watcher.Path = @"C:\LoQueSea"; 
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite 
    | NotifyFilters.FileName | NotifyFilters.DirectoryName; 
    watcher.Filter = "*.*"; 
    watcher.Created += new FileSystemEventHandler(OnCreated); 
    watcher.EnableRaisingEvents = true; 
} 
private void OnCreated() 
{ 
    try 
    { 
     if (!myObjectToPrint.Dispatcher.CheckAccess()) 
     { 
      myObjectToPrint.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal, 
       new Action(
        delegate() 
        { 
        //your code here... 
        } 
        ) 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    }   
} 

Saludos का उपयोग कर इसका समाधान नहीं होता ..

+0

पृथ्वी पर क्यों आप कोशिश करते हैं {} पकड़ो (अपवाद पूर्व) {फेंक दें; } '? यह स्टैक ट्रेस को डिबग करने के लिए कठिन क्रैश बनाने से अलग कुछ भी नहीं करता है। – tomfanning

+0

यह ओपी की रिपोर्ट की समस्या से बहुत अधिक संबंध नहीं लग रहा है (नामित घटना के बाद फ़ाइल सिस्टम सिस्टम में अनचाहे अपवाद) – tomfanning

+0

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

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