2011-12-08 9 views
11

cơ sở mã của Công ty của tôi có chứa C# dòng sau:Sử dụng Directory.Exists vào một thư mục mạng khi mạng xuống

bool pathExists = Directory.Exists(path); 

Khi chạy, chuỗi path sẽ xảy ra là địa chỉ của một thư mục trên công ty của mạng nội bộ - chẳng hạn như \\company\companyFolder. Khi kết nối từ máy tính Windows của tôi đến mạng nội bộ đang hoạt động, điều này hoạt động tốt. Tuy nhiên, khi kết nối đi xuống (như nó đã làm ngày hôm nay), việc thực thi dòng trên làm cho ứng dụng đóng băng hoàn toàn. Tôi chỉ có thể tắt ứng dụng bằng cách giết nó bằng Trình quản lý tác vụ.

Tất nhiên, tôi muốn có Directory.Exists(path) trả lại false trong trường hợp này. Có cách nào để làm việc này không?

Trả lời

11

Không có cách nào để thay đổi hành vi của Directory.Exists cho trường hợp này. Dưới mui xe nó làm cho một yêu cầu đồng bộ qua mạng trên thread UI. Nếu kết nối mạng bị treo do mất điện, lưu lượng truy cập quá nhiều, v.v ... nó cũng sẽ khiến cho chuỗi giao diện người dùng bị treo.

Điều tốt nhất bạn có thể làm là thực hiện yêu cầu này từ chuỗi nền và từ bỏ rõ ràng sau một khoảng thời gian nhất định trôi qua. Ví dụ

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

Điều này có thể dễ dàng ăn hết tất cả các chủ đề có sẵn trong nhóm chủ đề gây ra các sự cố khác trong ứng dụng. Nếu bạn định làm như thế này, bạn cần có khả năng chấm dứt hoạt động sau khi hết thời gian chờ. –

+0

@ csharptest.net đó là vấn đề, bạn không thể. Phương thức 'Directory.Exists' không thể được điều khiển cho timeout và vì nó cơ bản giảm ngay lập tức xuống sự kiện mã nguồn gốc một' Thread.Abort' sẽ không giúp bạn. – JaredPar

1

Nếu kết nối mạng nói chung là vấn đề chính của bạn, bạn có thể thử kiểm tra kết nối mạng trước đây:

[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); 
     } 
    } 

Sau đó xác định xem con đường là một đường dẫn UNC và trả lại false nếu mạng đang ngoại tuyến:

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

Không có điều này giúp khi máy chủ bạn đang cố gắng kết nối ngoại tuyến. Trong trường hợp đó bạn vẫn còn trong thời gian chờ mạng 2 phút.