[C#][2.0] Sauvegarde d'un DataSet dans des threads différents
Bonjour,
je suis confronté à un problème assez délicat:
La sauvegarde d'un DataSet dans des threads différents.
Ce code est exécuté sur un serveur. Le client identifie le bidon à l'entrée du convoyeur et appelle la méthode EntreeBidon.
Le bidon est ajouté à une file d'attente puis le statut est sauvegardé dans la base de données via .Net Remoting car cette base de données est géré par un serveur distant lui aussi.
Lorsque le bidon sort du convoyeur la méthode SortieBidon est appelé.
J'ai quelques soucis comme je le disais pour la gestion des threads. En effet, la sauvegarde dans la base de données est susceptibles de prendre un peu de temps. J'utilise donc le pool de threads pour la sauvegarde.
Pour ne pas avoir de problème d'accès concurrents, j'ai utilisé un lock pour verrouiller le DataSet à sauvegarder, mais je ne trouve pas ça terrible.
Comment devrais-je faire selon vous ?
Voilà comment j'ai procédé
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
private Queue<ProduitDataSet.BidonRow> m_FileBidons;
void EntreeBidon(ProduitDataSet dsProduits, int idBidon)
{
ProduitDataSet.BidonRow bidon = dsProduits.Bidons.FindByBidonId(idBidon);
if (bidon!=null)
{
m_FileBidons.Enqueue(bidon);
bidon.Statut = "EnCours";
// Sauvegarde du DataSet des produits
ThreadPool.QueueUserWorkItem(new WaitCallback(SaveProduitDataSet), dsProduits);
}
}
/// <summary>
/// Sauvegarde du DataSet
/// </summary>
private void SaveProduitDataSet(object objProduitDataSet)
{
ProduitDataSet dsProduit = objProduitDataSet as ProduitDataSet;
lock (m_ProduitDataSet)
{
// Fusion des bidons modifiés
if (dsProduit.Bidons.GetChanges(DataRowState.Modified) != null)
{
m_ProduitDataSet.Bidons.Merge(dsProduit.Bidons.GetChanges(DataRowState.Modified), false);
}
// Sauvegarde du DataSet
try
{
// Test Endormissement du thread courant
Console.WriteLine("Endormissement du Thread. {0}", Thread.CurrentThread.ManagedThreadId);
System.Threading.Thread.Sleep(10000);
Console.WriteLine("Réveil du Thread. {0}", Thread.CurrentThread.ManagedThreadId);
// Sauvegarde du DataSet
// m_GestionProduit est une interface distante accessible via .Net Remoting
m_GestionProduit.SaveProduits(m_ProduitDataSet);
// Valide les changements apportés
m_ProduitDataSet.AcceptChanges();
}
catch (Exception ex)
{
log.Error("Erreur lors de la sauvegarde du DataSet des produits.", ex);
}
}
}
private void SortieBidon()
{
ProduitDataSet.BidonRow bidon = dsProduits.Bidons.FindByBidonId(idBidon);
bidon.Statut = "Termine";
SaveBidon(bidon);
}
/// <summary>
/// Sauvegarde des modifications apportées à la ligne d'un bidon
/// </summary>
private void SaveBidon(ProduitDataSet.BidonRow rowBidon)
{
if (rowBidon!= null)
{
// Transtypage de la table du carton
ProduitDataSet.BidonsDataTable dtBidons = rowBidon.Table as ProduitDataSet.BidonsDataTable;
try
{
// Sauvegarde des modifications du cartons
m_GestionProduit.SaveBidon(dtCartons, rowBidon.BidonId);
rowBidon.AcceptChanges();
}
catch (Exception ex)
{
log.Error("Erreur lors de la sauvegarde du bidon.", ex);
}
}
} |
Je suis désolé si ce message est un peu long mais j'y suis obligé.
En espérant avoir été clair.
Merci d'avance pour votre aide.
A bientôt