Сбой уведомления FileSystemWatcher при отсутствии точек останова - PullRequest
1 голос
/ 28 июня 2011

Хорошо, это довольно странно.

Я создал приложение, которое прослушивает изменения внутри файла, а затем дублирует эти изменения в другом файле.Все работало хорошо, я почти ничего не изменил, попытался откатить свои изменения, но все равно не повезло.

Так вот в чем проблема: у меня есть FileSystemWatcher, и метод, который вызывается на "* 1006"*" событие.В течение некоторого времени я заметил, что мое приложение зависает при изменении, поэтому я посмотрел на свой метод, и все в порядке.На самом деле, он запускается, когда я ставлю точку останова внутри него.Но если я удаляю точку останова, то она падает, не оставляя тревожных ошибок (я думаю) в выходных данных, кроме:

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 + ")");
                }
            }
        }
    }
}

1 Ответ

2 голосов
/ 28 июня 2011

Я предполагаю, что проблема в одном из ваших двух потоковых ридеров или StreamWriter. Я предполагаю, что вы пытаетесь получить доступ к файлу, который все еще заблокирован другим процессом или даже вашим собственным процессом.

Постарайтесь сделать попытку уловки кода complete вашего обработчика событий. Это покажет, что исключение происходит в вашем обработчике событий, а не где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...