没有断点时FileSystemWatcher通知崩溃

本文关键字:通知 崩溃 FileSystemWatcher 断点 | 更新日期: 2023-09-27 18:00:31

好吧,这很奇怪。

我制作了一个应用程序,可以监听文件中的更改,然后将这些更改复制到另一个文件中。一切都很好,我几乎什么都没改变,试图回滚我的更改,但仍然没有运气。

所以问题来了:我有一个FileSystemWatcher,以及一个在"Changed"事件上被调用的方法。一段时间以来,我注意到我的应用程序在发生更改时会崩溃,所以我查看了我的方法,一切都很好。事实上,当我在其中放置断点时,它就会运行。但如果我删除断点,它就会崩溃,在输出中除了之外,不会留下任何令人担忧的错误(我认为)

The thread 'vshost.NotifyLoad' (0xa84) has exited with code 0 (0x0).
The thread 'vshost.LoadReference' (0x17e8) has exited with code 0 (0x0).
'TimeDataDuplicator.vshost.exe' (Managed (v4.0.30319)): Loaded 'C:'Users'Tommy Bergeron'Documents'Visual Studio 2010'Projects'vs-projects'TimeDataDuplicator'TimeDataDuplicator'bin'Debug'TimeDataDuplicator.exe', Symbols loaded.
A first chance exception of type 'System.IO.IOException' occurred in mscorlib.dll
The program '[6240] TimeDataDuplicator.vshost.exe: Program Trace' has exited with code 0 (0x0).
The program '[6240] TimeDataDuplicator.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).

非常奇怪的是,当没有断点时,一切都运行得很好。。。我试着清洗我的解决方案和我的项目,但没有成功。

有什么想法吗?有人偶然发现过这个吗?

非常感谢!


观察者:

private void StartWatcher()
{
    FileSystemWatcher watcher = new FileSystemWatcher();
    // Répertoire
    watcher.Path = @"C:'Symcod_data";
    // Nom du fichier à "watcher"
    watcher.Filter = "FILE_MSG.OK";
    // Choix des événements à notifier
    watcher.NotifyFilter = NotifyFilters.Size;
    // Assignation de méthode pour les événements choisies.
    watcher.Changed += FileHasChanged;
    // Début de l'observation
    watcher.EnableRaisingEvents = true;
    WriteLogMessage("TDD_WATCH_STARTED");
}

这是一个被称为的方法

void FileHasChanged(object source, FileSystemEventArgs e)
{
    // Lecture du fichier original
    using (StreamReader fileReader = new StreamReader(originalFile))
    {
        // On garde en mémoire le contenu du fichier dupliqué
        StreamReader duplicatedCheckReader = new StreamReader(duplicatedFile);
        string duplicatedCheckContent = duplicatedCheckReader.ReadToEnd();
        duplicatedCheckReader.Close();
        // Traitement du contenu du fichier original
        string line;
        string middleLineContent;   // Contiendra seulement le millieu de la ligne (sans les caractères spéciaux)
        while ((line = fileReader.ReadLine()) != null)
        {
            // On se sert seulement que le millieu de la ligne pour faire la recherche des doublons
            middleLineContent = line.Substring(line.IndexOf("-") + 1, 16);
            // Vérification des doublons, si le doublon n'est trouvé on écrit dans le fichier
            if (!Regex.IsMatch(duplicatedCheckContent, middleLineContent))
            {
                // Initialisation de l'écriture
                try
                {
                    using (StreamWriter fileWriter = new StreamWriter(duplicatedFile, true))
                    {
                        fileWriter.WriteLine(line);
                    }
                    WriteLogMessage("WriteLine_SUCCESS (" + line + ")");
                }
                catch (Exception ex)
                {
                    WriteLogMessage("WriteLine_FAIL [Exception: " + ex.InnerException + "] (" + line + ")");
                }
            }
        }
    }
}

没有断点时FileSystemWatcher通知崩溃

我认为问题出在您的两个StreamReader或StreamWriter中的一个。我假设您试图访问的文件仍然被其他进程锁定,甚至被您自己的进程锁定。

尝试在事件处理程序的完整代码周围放置Try-catch。这将表明,异常发生在您的事件处理程序中,而不是其他地方。