J'ai développé une application où plusieurs chaînes de connexion sont stockées. J'ai juste itéré dans une boucle for et connecté chaque base de données et exécuté un sql sur chaque base de données. De cette façon, j'ai mis à jour plusieurs bases de données avec une déclaration sql en masse.
J'ai maintenant besoin d'utiliser la bibliothèque parallèle des tâches pour mettre à jour plusieurs bases de données simultanément au lieu de les mettre à jour l'une après l'autre dans une boucle. Je veux aussi gérer les exceptions et afficher plusieurs barres de progression pour les opérations sur plusieurs bases de données.
lorsque je clique sur le bouton, plusieurs connexions à la base de données s'ouvrent et pour chaque tâche, une nouvelle barre de progression est ajoutée dans mon formulaire. chaque barre de progression indique la progression de chaque opération de la base de données. lorsqu'une tâche est terminée, la barre de progression correspondante est supprimée du formulaire.
quelqu'un peut me guider avec un exemple de code comment le faire en utilisant TPL. J'ai ici un code qui met à jour une barre de progression mais j'ai besoin de mettre à jour plusieurs barres de progression. int itérations = 100 ;
ProgressBar pb = new ProgressBar();
pb.Maximum = iterations;
pb.Dock = DockStyle.Fill;
Controls.Add(pb);
Task.Create(delegate
{
Parallel.For(0, iterations, i =>
{
Thread.SpinWait(50000000); // do work here
BeginInvoke((Action)delegate { pb.Value++; });
});
});
Question UPDATE
Je l'ai fait de cette façon. Le code fonctionne mais toutes les valeurs des barres de progression augmentent séquentiellement. J'ai un formulaire et un contrôle d'utilisateur dans les applications winform. S'il vous plaît, jetez un coup d'oeil à mon code et dites-moi ce qui ne va pas.
principal pour le code
public partial class Main : Form
{
public Main()
{
InitializeComponent();
this.DoubleBuffered = true;
}
private void btnStart_Click(object sender, EventArgs e)
{
Progress ucProgress = null;
Dictionary<string, string> dicList = new Dictionary<string, string>();
dicList.Add("GB", "conn1");
dicList.Add("US", "conn2");
dicList.Add("DE", "conn3");
fpPanel.Controls.Clear();
Task.Factory.StartNew(() =>
{
foreach (KeyValuePair<string, string> entry in dicList)
{
ucProgress = new Progress();
ucProgress.Country = entry.Key;
ucProgress.DBConnection = entry.Value;
fpPanel.BeginInvoke((MethodInvoker)delegate
{
fpPanel.Controls.Add(ucProgress);
ucProgress.Process();
});
//fpPanel.Controls.Add(ucProgress);
System.Threading.Thread.SpinWait(5000000);
}
});
}
private void Main_Resize(object sender, EventArgs e)
{
this.Invalidate();
}
private void Main_Paint(object sender, PaintEventArgs e)
{
using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle,
Color.WhiteSmoke,
Color.LightGray,
90F))
{
e.Graphics.FillRectangle(brush, this.ClientRectangle);
}
}
}
code de contrôle de l'utilisateur
public partial class Progress : UserControl
{
public Progress()
{
InitializeComponent();
lblMsg.Text = "";
pbStatus.Minimum = 0;
pbStatus.Maximum = 100;
}
public string Country { get; set; }
public string DBConnection { get; set; }
public string Sql { get; set; }
public void SetMessage(string strMsg)
{
lblMsg.Text = strMsg;
}
public void Process()
{
var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task.Factory.StartNew(() =>
{
lblMsg.BeginInvoke((MethodInvoker)delegate
{
lblMsg.Text = "Connecting country " + Country;
});
pbStatus.BeginInvoke((MethodInvoker)delegate
{
pbStatus.Value = 30;
});
System.Threading.Thread.SpinWait(50000000);
//***********
lblMsg.BeginInvoke((MethodInvoker)delegate
{
lblMsg.Text = "executing sql for country " + Country;
});
pbStatus.BeginInvoke((MethodInvoker)delegate
{
pbStatus.Value = 60;
});
System.Threading.Thread.SpinWait(50000000);
//***********
lblMsg.BeginInvoke((MethodInvoker)delegate
{
lblMsg.Text = "sql executed successfully for country " + Country;
});
pbStatus.BeginInvoke((MethodInvoker)delegate
{
pbStatus.Value = 100;
});
System.Threading.Thread.SpinWait(50000000);
});
//System.Threading.Thread.SpinWait(50000000); // do work here
}
}