Comment attribuer thread séparé pour chaque Système de Fichiers de l'Observateur?
Je suis en train d'élaborer un la base de données du système de fichiers.Il comprend un multi-répertoire de l'observateur qui est un service windows et qui utilise le fichier system watcher classe .net.
Je veux exécuter chaque classe watcher sur le thread séparé.Thread ne peut pas être prolongée .net parce que c'est "Scellé".
Ce que je veux dire, c'est l'exécution de toutes les méthodes de ma classe watcher dans le sujet.
Comment puis-je y parvenir?
MODIFIER -
Qui suit est ma base de classe watcher.
public abstract class WatcherBase
{
private IWatchObject _watchObject;
public WatcherBase() { }
public WatcherBase(IWatchObject watchObject, bool canPauseAndContinue)
{
_watchObject = watchObject;
CanPauseAndContinue = canPauseAndContinue;
}
public bool CanPauseAndContinue { get; set; }
public IWatchObject ObjectToWatch
{
get
{
return _watchObject;
}
}
public abstract void Start();
public abstract void Pause();
public abstract void Continue();
public abstract void Stop();
}
Qui suit est mon annuaire de l'observateur de la classe étendue de la WatcherBase classe
namespace RankFs.WatcherService
{
public class DirectoryWatcher : WatcherBase
{
private WatchDirectory _directoryToWatch;
private FileSystemWatcher _watcher;
public DirectoryWatcher(WatchDirectory directory, bool CanPauseAndContinue)
:base(directory ,CanPauseAndContinue)
{
_directoryToWatch = directory;
_watcher = new FileSystemWatcher(_directoryToWatch.Path);
_watcher.IncludeSubdirectories = _directoryToWatch.WatchSubDirectories;
_watcher.Created +=new FileSystemEventHandler(Watcher_Created);
//_watcher.Changed +=new FileSystemEventHandler(Watcher_Changed);
_watcher.Deleted +=new FileSystemEventHandler(Watcher_Deleted);
_watcher.Renamed +=new RenamedEventHandler(Watcher_Renamed);
}
public WatchDirectory DirectoryToWatch
{
get
{
return _directoryToWatch;
}
}
public override void Start()
{
_watcher.EnableRaisingEvents = true;
}
public override void Pause()
{
_watcher.EnableRaisingEvents = false;
}
public override void Continue()
{
_watcher.EnableRaisingEvents = true;
}
public override void Stop()
{
_watcher.EnableRaisingEvents = false;
}
private void Watcher_Created(object sender, FileSystemEventArgs e)
{
//adds a new file entry to database
}
private void Watcher_Deleted(object sender, FileSystemEventArgs e)
{
//updates the database(deleted file)
}
private void Watcher_Renamed(object sender, RenamedEventArgs e)
{
//updates the database(renamed file)
}
} }
Je suis coincé à ce point.S'il vous plaît aider moi.
OriginalL'auteur Pale Blue Dot | 2010-02-23
Vous devez vous connecter pour publier un commentaire.
La
FileSystemWatcher
va déclencher les événements dans un thread séparé. La logique à l'intérieur de l'gestionnaires d'événements aurez besoin de prendre ce fait en considération et d'effectuer une synchronisation nécessaire.Si vous exécutez l'exemple suivant, vous verrez que la
Changed
gestionnaire d'événement sera exécuté dans un thread différent.Lors de l'exécution de cet exemple, j'ai obtenu le résultat suivant:
Mise à JOUR:
Puisque vous utilisez les événements approche dans le
FileSystemWatcher
vous êtes déjà à l'aide d'une approche multithread parce que les gestionnaires d'événements pour chaqueFileSystemWatcher
instance sera déclenchée dans un thread séparé de manière asynchrone.Vous n'avez pas besoin de faire autre chose pour obtenir vos méthodes de gestionnaire d'événement pour s'exécuter sur un thread séparé
Voici le résultat que j'ai obtenu. 'Thread principal Id 12 Fichier de test Thread 13 Fichier de test Thread 13' Toujours pas de multithreading.Pourquoi donc?
Comme vous pouvez le voir par vous-même, vous avez deux thread différent identifiants à partir de la sortie. Cela signifie que l'exécution dans deux threads différents. Qu'entendez-vous par pas de multithreading?
Ce que je veux dire,c'est 12 est thread principal.Mais ne devrait pas être là 2 thread différent pour le répertoire distinct de l'observateur.Comme le Fichier de test thread 13 Fichier de test thread 14 ??
OriginalL'auteur João Angelo
Je voudrais écrire une nouvelle classe qui enveloppements ou adapte FileSystemWatcher, puis lancement de ma nouvelle classe sur un nouveau thread. La classe d'adaptateur va gérer les notifications de FPPF de la classe, et vous pouvez ensuite travailler sur la meilleure façon de diffuser ou relayer les notifications à une sorte de regroupement de la fonction.
Il y a quelques différentes façons de lancer de nouvelles discussions et des milliards de tutoriels sur la façon de le faire, donc je ne vais pas couvrir qu'ici, dans cette réponse.
OriginalL'auteur slugster