C# FileSystemWatcher导致桌面崩溃

C# FileSystemWatcher导致桌面崩溃,c#,.net,filesystemwatcher,C#,.net,Filesystemwatcher,我正在编写一个解决方案,其中使用了一些在运行时应可编辑的配置文件。我以前一直在使用FileSystemWatcher来实现这一目的,但从未遇到过太多问题,但现在它导致了“重命名”事件的CTD 这段(无用的)代码将在我的设置中重现问题: private static int _s_renamed; private static int _s_created; private static int _s_errors; private static void monitorConfiguratio

我正在编写一个解决方案,其中使用了一些在运行时应可编辑的配置文件。我以前一直在使用
FileSystemWatcher
来实现这一目的,但从未遇到过太多问题,但现在它导致了“重命名”事件的CTD

这段(无用的)代码将在我的设置中重现问题:

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;
}
private static int\u s\u重命名;
创建了私有静态int;
私有静态int_s_错误;
专用静态无效监视器配置(字符串configRootFolder)
{
var fsw=新的FileSystemWatcher(configRootFolder、ConfigFilePattern)
{
NotifyFilter=NotifyFilters.LastWrite | NotifyFilters.FileName,
IncludeSubdirectories=false
};
fsw.重命名+=(发送方,参数)=>++++u s_重命名;//++u s_创建;
fsw.Error+=(发送方,参数)=>++\u错误;
fsw.EnableRaisingEvents=true;
}
崩溃似乎来自
FileSystemWatcher
。如果我在事件处理程序中为
FileSystemWatcher.Renamed
设置断点,它会被命中,但当我跳出时应用程序会崩溃。如果在
FileSystemWatcher.Created
事件处理程序中设置断点,则不会发生这种情况

有什么建议吗


编辑1: 我在Windows7x64(Ultimate)平台上运行.NET4
我看到过一些关于这类问题的讨论,但都与试图从事件处理程序更新UI内容(必须从主/UI线程完成)的人有关。这就是为什么我只是尝试在实验代码中增加一些计数器。

您可能会遇到这三种情况中的任何一种

  • 传入的目录不存在,正在抛出未找到的文件io
  • 传入的目录有效,但运行该目录的进程没有访问权限
  • 传入的参数(sender、args)可能为null,并且您的代码(因为这是一个示例,我们看不到真正的代码)没有处理null并抛出错误

  • 在.NET中,必须将FileSystemWatcher生成的线程与UI线程同步。为此,UI控件有一个类似于myControl.Invoke(…)的方法来实现此效果。任何其他尝试同步的方法都会产生一些随机效果,如崩溃、异常等

    请看这里: http://weblogs.asp.net/justin_rogers/pages/126345.aspx


    希望有帮助

    可能您的文件或对象正在使用中,我遇到了类似的问题,我使用以下代码解决了它

    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..

    只是想澄清一下:

    这里的问题是,在我的系统的其他地方,我的
    FileSystemWatcher
    的使用者更多/更老,其中一个导致了未处理的异常。问题是异常被抛出到一个完全不同的线程中,并导致应用程序崩溃到桌面。这个时机让我误以为是我的新消费者以某种方式导致了isse,但当我遵循Chris Shain的建议(参见问题条目中的评论)启用中断异常()时,我立即发现了真正的罪魁祸首

    我更愿意将解决方案归功于克里斯,但他从未重新发布过,所以就在这里。希望我们学到了一些东西

    谢谢大家,祝你快乐


    /Jonas

    不,应用程序崩溃到桌面上,我似乎抓不到它。这是一个WPF应用程序,我正在捕获所有未处理的异常(application.dispatchernhandledexception),但这一个未被捕获。CTD=“Crash To Desktop”我已经用您的代码创建了WPF项目。我已经在应用程序的构造函数中启动了watcher,它运行良好。Win7 x64(企业版)。在WPF中,UI线程上的异常通常会导致CTD。当您在调试器中运行时,请使用中断异常以100%确保不会抛出异常:克里斯:谢谢您指出这一点!把它写下来作为答案,我会把它标记为答案。我已经很久没有打开“例外中断”了,我忘记了那个把戏。事实证明,我在别处有更多的事件处理程序(用于“重命名”),其中一个失败了。似乎
    FileSystemWatcher
    中的错误处理代码不充分,但问题出在我自己的代码中。我有点生气,当异常从我自己的一个事件处理程序中抛出时,调试器没有中断,但你在这里。谢谢你到底为什么
    尝试{}catch(Exception ex){throw ex;}
    ?除了破坏堆栈跟踪使崩溃更难调试之外,这完全没有任何作用。此外,这似乎与OP报告的问题没有多大关系(在重命名事件激发后FileSystemWatcher中出现未处理的异常)。这种看似毫无意义的尝试…捕获对于调试目的非常有用。在“throw-ex”上放置断点将使您能够检查在试图解决某些意外异常时发生的情况。当然,当你完成后,它应该被移除。