Domanda

Abbiamo appena cominciato a correre per uno strano problema con un FileSystemWatcher in cui il richiamo all'Dispose() sembra essere appeso.Questo è il codice che ha lavorato senza problemi per un po', ma abbiamo appena aggiornato per .NET3.5 SP1 quindi sto cercando di scoprire se qualcuno ha visto questo comportamento.Qui è il codice che crea il 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();

Il modo in cui questo viene utilizzato è quello di aggiornare l'immagine di stato di un oggetto TreeNode (leggermente modificati per rimuovere business informazioni specifiche):

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

C'è qualcosa che ci manca o è un'anomalia da .NET3.5 SP1?

È stato utile?

Soluzione

Solo un pensiero...Qualche possibilità c'è una situazione di stallo problema?

Si chiama TreeView.Invoke, che è una chiamata di blocco.Se un filesystem cambiamento avviene proprio come stai facendo clic su qualsiasi pulsante provoca il FileSystemWatcher.Dispose() chiamata, il FileWatcherFileChanged metodo verrà chiamato in un thread in background e chiamare TreeView.Invocare, che blocca fino a quando la vostra forma del filo in grado di elaborare la richiesta di Richiamare.Tuttavia, il modulo thread sarebbe chiamata FileSystemWatcher.Dispose(), che probabilmente non tornare fino a quando tutti in attesa di richieste di modifica sono trattati.

Provare a cambiare .Invoca .BeginInvoke e vedere se questo aiuta.Che può aiutare a punto nella giusta direzione.

Naturalmente, potrebbe anche essere .Rete 3.5SP1 problema.Sto solo speculando qui, in base al codice che hai fornito.

Altri suggerimenti

Scott, abbiamo visto occasionalmente problemi di controllo.Invocare .NET 2.Provare a passare a un controllo.BeginInvoke e vedere se questo aiuta.

Facendo, che consentirà il FileSystemWatcher thread per tornare immediatamente.Ho il sospetto che il problema sia in qualche modo che il controllo.Richiamare è il blocco, causando in tal modo il FileSystemWatcher a congelare su di smaltire.

Stiamo avendo questo problema.La nostra applicazione funziona su .Net 2.0, ma è compilato da valori di VS 2008 SP1.Ho .NET 3.5 SP1 installato.Non ho idea del perché questo accade, non ha l'aspetto di un deadlock problema sul nostro fine, come nessun altro thread sono in esecuzione a questo punto (è durante la chiusura dell'applicazione).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top