2012-01-06 33 views
11

Tôi đang viết một giải pháp nơi tôi sử dụng một số tệp cấu hình có thể chỉnh sửa được khi chạy. Tôi đã sử dụng FileSystemWatcher cho mục đích này trước và không bao giờ có nhiều vấn đề với nó nhưng bây giờ nó gây ra một CTD vào sự kiện 'đổi tên'.FileSystemWatcher gây ra sự cố cho máy tính để bàn

này (vô dụng) đoạn mã sẽ tạo lại vấn đề trong thiết lập của tôi:

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

Vụ tai nạn xuất phát từ FileSystemWatcher vẻ bề ngoài. Nếu tôi đặt điểm ngắt trong trình xử lý sự kiện cho FileSystemWatcher.Renamed thì nó sẽ bị tấn công nhưng ứng dụng sẽ đổ vỡ khi tôi bước ra khỏi nó. Nếu tôi đặt điểm ngắt trong trình xử lý sự kiện FileSystemWatcher.Created thì điều này không xảy ra.

Mọi đề xuất?


EDIT 1: Tôi đang chạy NET 4 trên x64 Windows 7 (Ultimate) nền tảng Tôi đã thấy một vài cuộc thảo luận liên quan đến loại hình này của vấn đề nhưng tất cả đã được liên quan đến người cố gắng cập nhật giao diện người dùng thứ (phải được thực hiện từ luồng chính/giao diện người dùng) từ trình xử lý sự kiện. Đó là lý do tại sao tôi chỉ cố gắng tăng một số quầy trong mã thử nghiệm.

+2

Có một ngoại lệ? – David

+0

Không, ứng dụng gặp sự cố với máy tính để bàn và có vẻ như tôi không thể bắt được. Đó là một ứng dụng WPF và tôi đang bắt tất cả các ngoại lệ chưa được giải quyết (Application.DispatcherUnhandledException) nhưng điều này không bị bắt. –

+0

CTD là gì và nó hoạt động như thế nào? – Gabe

Trả lời

1

Chỉ cần làm rõ:

Vấn đề ở đây là tôi có nhiều người tiêu dùng cũ hơn/cũ hơn trong số FileSystemWatcher ở những nơi khác trong hệ thống của tôi và một trong số đó gây ra ngoại lệ không được giải quyết. Vấn đề là ngoại lệ được ném vào một chủ đề hoàn toàn khác và khiến cho ứng dụng trở thành crasch cho máy tính để bàn. Thời gian đã lừa tôi nghĩ rằng đó là người tiêu dùng mới của tôi bằng cách nào đó gây ra cái chết nhưng khi tôi theo lời khuyên của Chris Shain (xem bình luận trong mục câu hỏi) để cho phép phá vỡ các ngoại lệ (msdn.microsoft.com/en-us/library/d14azbfh.aspx) Tôi lập tức tìm ra thủ phạm thực sự.

Tôi đã ưu tiên ghi nhận Chris bằng giải pháp nhưng anh ấy không bao giờ đăng lại như vậy ở đây.Hy vọng rằng chúng tôi đã học được điều gì đó.

Cảm ơn tất cả mọi người và hạnh phúc mã hóa

/Jonas

0

Bạn có thể chạy vào bất kỳ trong ba tình huống

  1. Thư mục thông qua trong không tồn tại và một file io không tìm thấy đang được ném.
  2. Thư mục được truyền vào hợp lệ nhưng quá trình chạy nó không có quyền truy cập
  3. Đối số (người gửi, args) được chuyển vào, có thể là null và mã của bạn (vì đây là ví dụ và chúng tôi có thể ' t xem mã thực) không xử lý null và ném lỗi.
0

Trong .NET, bạn phải đồng bộ hóa chuỗi được tạo bởi FileSystemWatcher với Giao diện người dùng. Đối với điều này, các điều khiển giao diện người dùng có một phương pháp như: myControl.Invoke (...) cho hiệu ứng này. Bất kỳ cách nào khác để cố gắng đồng bộ hóa sẽ có một số hiệu ứng ngẫu nhiên như crashs, Exceptions vv

thấy ở đây: http://msdn.microsoft.com/en-us/magazine/cc300429.aspx http://weblogs.asp.net/justin_rogers/pages/126345.aspx

hy vọng nó giúp

0

có lẽ tập tin hoặc đối tượng của bạn đang được sử dụng, tôi đã có một vấn đề tương tự và tôi giải quyết nó bằng cách sử dụng đoạn mã sau

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

Tại sao trên trái đất bạn có 'try {} catch (Exception ex) {throw ex; } '? Điều này không chính xác gì ngoài việc làm hỏng dấu vết ngăn xếp làm cho một vụ tai nạn khó khăn hơn để gỡ lỗi. – tomfanning

+0

Ngoài ra điều này dường như không có liên quan nhiều đến vấn đề OP báo cáo (unhandled ngoại lệ trong FileSystemWatcher sau khi đổi tên sự kiện bắn) – tomfanning

+0

Loại thử dường như vô nghĩa ... bắt có thể hữu ích cho mục đích gỡ lỗi. Đặt một breakpoint trên "throw ex" sẽ cung cấp cho bạn khả năng kiểm tra những gì đang xảy ra khi bạn đang cố gắng giải quyết một số ngoại lệ bất ngờ. Nó nên được loại bỏ khi bạn đang thực hiện tất nhiên. –

Các vấn đề liên quan