2011-12-08 8 views
11

मेरी कंपनी का कोड बेस निम्नलिखित सी # लाइन शामिल हैं:का उपयोग Directory.Exists जब नेटवर्क काम कर रहा

bool pathExists = Directory.Exists(path); 

रनटाइम पर, स्ट्रिंग path कंपनी के पर एक फ़ोल्डर का पता होता है इंट्रानेट - \\company\companyFolder की तरह कुछ। जब मेरी विंडोज मशीन से इंट्रानेट तक कनेक्शन बढ़ जाता है, तो यह ठीक काम करता है। हालांकि, जब कनेक्शन नीचे चला जाता है (जैसा कि आज किया गया था), ऊपर की रेखा को निष्पादित करने से एप्लिकेशन पूरी तरह से जमा हो जाता है। मैं केवल कार्य प्रबंधक के साथ इसे मार कर एप्लिकेशन को बंद कर सकता हूं।

बेशक, इस परिदृश्य में Directory.Exists(path) वापसी false होगा। क्या इसे करने का कोई तरीका है?

उत्तर

11

इस परिदृश्य के लिए Directory.Exists के व्यवहार को बदलने का कोई तरीका नहीं है। हुड के तहत यह यूआई थ्रेड पर नेटवर्क पर एक तुल्यकालिक अनुरोध कर रहा है। यदि नेटवर्क कनेक्शन आउटेज, बहुत अधिक यातायात, आदि के कारण लटकता है ... यह UI थ्रेड को भी लटकने का कारण बनता है।

सबसे अच्छा आप यह कर सकते हैं कि यह पृष्ठभूमि पृष्ठभूमि धागे से हो और स्पष्ट रूप से कुछ समय बीतने के बाद छोड़ दें। उदाहरण के लिए

Func<bool> func =() => Directory.Exists(path); 
Task<bool> task = new Task<bool>(func); 
task.Start(); 
if (task.Wait(100)) { 
    return task.Value; 
} else { 
    // Didn't get an answer back in time be pessimistic and assume it didn't exist 
    return false; 
} 
+3

यह आसानी से थ्रेड पूल में उपलब्ध सभी थ्रेड खा सकता है जिससे आवेदन के भीतर और समस्याएं आती हैं। यदि आप ऐसा कुछ करने जा रहे हैं तो आपको टाइमआउट समाप्त होने के बाद ऑपरेशन को समाप्त करने में सक्षम होना चाहिए। –

+0

@ csharptest.net हालांकि समस्या है, आप नहीं कर सकते हैं। 'Directory.Exists' विधि को टाइमआउट के लिए नियंत्रित नहीं किया जा सकता है और चूंकि यह अनिवार्य रूप से मूल कोड ईवेंट पर नीचे गिर जाता है, इसलिए 'थ्रेड.एबॉर्ट' आपकी सहायता नहीं करेगा। – JaredPar

1

सामान्य नेटवर्क कनेक्टिविटी अपनी प्राथमिक समस्या है, तो आप इस से पहले नेटवर्क कनेक्टिविटी परीक्षण की कोशिश कर सकते:

[DllImport("WININET", CharSet = CharSet.Auto)] 
    static extern bool InternetGetConnectedState(ref int lpdwFlags, int dwReserved); 

    public static bool Connected 
    { 
     get 
     { 
      int flags = 0; 
      return InternetGetConnectedState(ref flags, 0); 
     } 
    } 

तो यह निर्धारित करता है, तो पथ एक यूएनसी मार्ग है और झूठे वापसी करता है, तो नेटवर्क ऑफ़लाइन है:

public static bool FolderExists(string directory) 
    { 
     if (new Uri(directory, UriKind.Absolute).IsUnc && !Connected) 
      return false; 
     return System.IO.Directory.Exists(directory); 
    } 

कोई भी होस्ट उस होस्ट में मदद करता है जब आप जिस होस्ट से कनेक्ट करने का प्रयास कर रहे हैं वह ऑफ़लाइन है। उस स्थिति में आप अभी भी 2-मिनट के नेटवर्क टाइमआउट के लिए हैं।

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