Вызов FileSystemWatcher Dispose зависает

Мы только начали сталкиваться с странной проблемой с FileSystemWatcher, где вызов Dispose (), кажется, зависает. Это код, который какое-то время работал без проблем, но мы только что обновились до .NET3.5 SP1, поэтому я пытаюсь выяснить, видел ли кто-нибудь такое поведение. Вот код, который создает FileSystemWatcher:

if (this.fileWatcher == null)
{
   this.fileWatcher = new FileSystemWatcher();
}
this.fileWatcher.BeginInit();
this.fileWatcher.IncludeSubdirectories = true;
this.fileWatcher.Path = project.Directory;
this.fileWatcher.EnableRaisingEvents = true;
this.fileWatcher.NotifyFilter = NotifyFilters.Attributes;
this.fileWatcher.Changed += delegate(object s, FileSystemEventArgs args)
{
   FileWatcherFileChanged(args);
};
this.fileWatcher.EndInit();

Это используется для обновления изображения состояния объекта TreeNode (немного скорректировано для удаления бизнес-информации):

private void FileWatcherFileChanged(FileSystemEventArgs args)
{
   if (this.TreeView != null)
   {
      if (this.TreeView.InvokeRequired)
      {
         FileWatcherFileChangedCallback d = new FileWatcherFileChangedCallback(FileWatcherFileChanged);
         this.TreeView.Invoke(d, new object[]
      {
         args
      });
      }
      else
      {
         switch (args.ChangeType)
         {
            case WatcherChangeTypes.Changed:
               if (String.CompareOrdinal(this.project.FullName, args.FullPath) == 0)
               {
                  this.StateImageKey = GetStateImageKey();
               }
               else
               {
                  projectItemTreeNode.StateImageKey = GetStateImageKey();
               }
               break;
         }
      }
   }
}

Что-то нам не хватает или это аномалия из .NET3.5 SP1?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
5 391
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Просто мысль ... Есть ли шанс, что здесь проблема с тупиком?

Вы вызываете TreeView.Invoke, что является блокирующим вызовом. Если изменение файловой системы происходит так же, как вы нажимаете любую кнопку, вызывающую вызов FileSystemWatcher.Dispose (), ваш метод FileWatcherFileChanged будет вызван в фоновом потоке и вызовет TreeView.Invoke, который будет блокироваться до тех пор, пока ваш поток формы не сможет обработать запрос Invoke. . Однако поток вашей формы будет вызывать FileSystemWatcher.Dispose (), который, вероятно, не вернется, пока не будут обработаны все ожидающие запросы на изменение.

Попробуйте изменить .Invoke на .BeginInvoke и посмотрите, поможет ли это. Это может указать вам правильное направление.

Конечно, это также может быть проблема .NET 3.5SP1. Я просто размышляю здесь на основе предоставленного вами кода.

У нас тоже есть эта проблема. Наше приложение работает на .Net 2.0, но скомпилировано VS 2008 SP1. У меня также установлен .NET 3.5 SP1. Я понятия не имею, почему это происходит, это не похоже на проблему с тупиком с нашей стороны, поскольку в этот момент другие потоки не работают (это во время завершения работы приложения).

Если вы используете FileSystemWatcher, вы потенциально используете другой поток; поток FileSystemWatcher может быть заблокирован при попытке вызова в потоке пользовательского интерфейса.

Judah Gabriel Himango 30.09.2008 20:41

Скотт, мы иногда наблюдали проблемы с control.Invoke в .NET 2. Попробуйте переключиться на control.BeginInvoke и посмотрите, поможет ли это.

Это позволит потоку FileSystemWatcher немедленно вернуться. Я подозреваю, что ваша проблема заключается в том, что control.Invoke блокируется, что приводит к зависанию FileSystemWatcher при удалении.

Кажется, это так и является правильным решением. Я вручил ответ Джонатану, поскольку он ответил первым.

Scott Dorman 03.10.2008 23:34

Другие вопросы по теме