L'approche traditionnelle consiste à créer un ensemble fini de threads (peut être aussi petit que 1) et de les faire regarder une file d'attente de blocage. Le code dans les gestionnaires d'événements mettra en file d'attente les éléments de travail pendant que le (s) thread (s) de travail les supprime et les traite.Il peut ressembler à ce qui suit qui utilise la classe BlockingCollection qui est disponible dans .NET 4.0 ou dans le cadre du téléchargement Reactive Extensions.
Remarque: Le code est court et concis pour des raisons de concision. Vous devrez développer et durcir vous-même.
public class Example
{
private BlockingCollection<string> m_Queue = new BlockingCollection<string>();
public Example()
{
var thread = new Thread(Process);
thread.IsBackground = true;
thread.Start();
}
private void FileSystemWatcher_Event(object sender, EventArgs args)
{
string file = GetFilePathFromEventArgs(args);
m_Queue.Add(file);
}
private void Process()
{
while (true)
{
string file = m_Queue.Take();
// Process the file here.
}
}
}
Vous pouvez profiter de la classe Task
dans le TPL pour une plus moderne et ThreadPool
approche -comme. Vous devez démarrer une nouvelle tâche pour chaque fichier (ou peut-être les traiter par lots) qui doit être traitée. La seule chose que je vois avec cette approche est qu'il serait plus difficile de contrôler le nombre de connexions à la base de données ouvertes simultanément. Ce n'est certainement pas un showstopper et il pourrait être sans importance.
Le FileSystemWatcher
a été connu pour être un peu squameuse il est souvent conseillé d'utiliser une méthode secondaire de découvrir les changements de fichiers au cas où ils seront oubliées par le FileSystemWatcher
. Votre kilométrage peut varier sur ce problème.
Pourquoi le service et le dossier spécial de dépôt? Pourquoi ne pas simplement faire glisser un groupe de fichiers sur un fichier .exe normal et l'exécuter, faire l'importation dans la base de données, puis mourir? – Reinderien
@Reinderien: J'imagine que le terme "abandonné" ici ne se réfère pas au processus d'un utilisateur faisant glisser et déposer des fichiers, mais plutôt à un système produisant des fichiers dans un certain dossier. –
@Fredrik, vous avez raison. J'ai mentionné qu'il est déposé dans un dossier. –