Question

Nous venons tout juste de commencer à rencontrer un problème étrange avec FileSystemWatcher où l'appel à Dispose () semble être suspendu. C'est un code qui fonctionne sans aucun problème depuis un moment, mais nous venons de passer à .NET3.5 SP1. J'essaie donc de savoir si quelqu'un d'autre a déjà vu ce comportement. Voici le code qui crée 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();

Ceci est utilisé pour mettre à jour l'image d'état d'un objet TreeNode (légèrement ajusté pour supprimer les informations spécifiques à l'entreprise):

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

Quelque chose nous manque-t-il ou s'agit-il d'une anomalie de .NET3.5 SP1?

Était-ce utile?

La solution

Juste une pensée ... Y a-t-il un problème d'impasse ici?

Vous appelez TreeView.Invoke, un appel bloquant. Si un changement de système de fichiers se produit au moment où vous cliquez sur le bouton qui provoque l'appel de FileSystemWatcher.Dispose (), votre méthode FileWatcherFileChanged sera appelée sur un thread d'arrière-plan et appellera TreeView.Invoke, qui sera bloquée jusqu'à ce que votre thread de formulaire puisse traiter la demande Invoke. . Toutefois, votre fil de formulaire appelle FileSystemWatcher.Dispose (), qui ne sera probablement pas renvoyé tant que toutes les demandes de modification en attente ne seront pas traitées.

Essayez de remplacer .Invoke par .BeginInvoke et voyez si cela vous aide. Cela peut aider à vous orienter dans la bonne direction.

Bien sûr, il pourrait également s'agir d'un problème lié à .NET 3.5SP1. Je ne fais que spéculer ici en fonction du code que vous avez fourni.

Autres conseils

Scott, nous avons parfois rencontré des problèmes avec control.Invoke dans .NET 2. Essayez de passer à control.BeginInvoke et voyez si cela vous aide.

Cela permettra au thread FileSystemWatcher de revenir immédiatement. Je soupçonne que votre problème est en quelque sorte que le contrôle.Invoke bloque, ce qui provoque le blocage de FileSystemWatcher lors de son élimination.

Nous avons également ce problème. Notre application fonctionne sous .Net 2.0 mais est compilée par VS 2008 SP1. J'ai également installé .NET 3.5 SP1. Je ne sais pas pourquoi cela se produit non plus, cela ne ressemble pas à un problème de blocage, car aucun autre thread n'est en cours d'exécution à ce stade (c'est pendant l'arrêt de l'application).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top