J'ai besoin de découper les gros fichiers CSV en plusieurs insertions db différentes en utilisant SqlBulkCopy. J'ai l'intention de le faire via 2 tâches distinctes, 1 pour le traitement par lots du fichier CSV et un autre pour l'insertion dans la base de données. À titre d'exemple voici ce que je suis la chose:Producteur/Consommateur parallèle avec tolérance aux pannes?
public class UberTask
{
private readonly BlockingCollection<Tuple<string,int>> _store = new BlockingCollection<Tuple<string, int>>();
public void PerformTask()
{
var notifier = new UINotifier();
Task.Factory.StartNew(() =>
{
for (int i =0; i < 10; i++)
{
string description = string.Format("Scenario {0}", i);
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Reading '{0}' from file", description)));
// represents reading the CSV file.
Thread.Sleep(500);
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Enqueuing '{0}'", description)));
_store.Add(new Tuple<string, int>(description, i));
}
_store.CompleteAdding();
});
var consumer = Task.Factory.StartNew(() =>
{
foreach (var item in _store.GetConsumingEnumerable())
{
var poppedItem = item;
notifier.PerformOnTheUIThread(() => Console.WriteLine(string.Format("Sending '{0}' to the database", poppedItem.Item1)));
// represents sending stuff to the database.
Thread.Sleep(1000);
}
});
consumer.Wait();
Console.WriteLine("complete");
}
}
Est-ce un bon moyen d'appairer 2 ensembles de tâches connexes? Ce que le code ci-dessus ne gère pas (ce qui doit):
- Si la tâche qui représente les défauts de lecture CSV, l'autre tâche doit cesser
- (même s'il y a encore des éléments à _store.) Si la tâche qui représente le db insère des erreurs, l'autre processus peut simplement arrêter le traitement.
- Si l'une des tâches appariées est défectueuse, j'aurai besoin d'effectuer une action pour annuler les mises à jour db (je ne m'inquiète pas de la façon dont je vais annuler), mais plutôt de savoir comment une des tâches jumelées, je dois donc faire du rangement ".
Une aide sur ce qui précède serait grandement appréciée!
Merci pour la réponse détaillée Ade! – primalgeek