Chcesz skorzystać z Biblioteki zadań równoległych z raportowaniem postępów w aktualizowaniu bazy danych

opracowałem aplikację, w której przechowywany jest ciąg wielu połączeń. Po prostu iteruję w pętli for i podłączam każdą db i wykonuję sql do każdej db. w ten sposób aktualizuję wiele baz danych za pomocą zbiorczej instrukcji sql.

Teraz potrzebuję teraz użyć Task Parallel Library, aby zaktualizować wiele db jednocześnie, zamiast aktualizować jeden po drugim w pętli. chcę także obsługiwać wyjątek, a także pokazać pasek postępu wielu operacji na wielu bazach danych. powinna tam być funkcja pauzy i wznowienia.

gdy kliknę przycisk, otworzy się połączenie wielu db i dla każdego zadania zostanie dodany nowy pasek postępu w moim formularzu. każdy pasek postępu pokaże każdy postęp operacji db. kiedy jakiekolwiek zadanie zostanie zakończone, odpowiedni pasek postępu zostanie usunięty z formularza.

każdy może poprowadzić mnie za pomocą przykładowego kodu, jak to zrobić za pomocą TPL. tutaj mam jeden kod, który aktualizuje jeden pasek postępu, ale muszę zaktualizować pasek postępu wielu. int iteracje = 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++; });   
    });   
}); 
AKTUALIZUJ Pytanie

zrobiłem to w ten sposób. kod działa, ale cała wartość paska postępu zwiększa się sekwencyjnie. Mam jedną formę i jedną kontrolę użytkownika w aplikacjach WinForm. spójrz na mój kod i powiedz mi, co tam jest nie tak.

główny dla kodu
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);
            }
        }
    }
kod kontrolny użytkownika
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   
        }
    }

questionAnswers(1)

yourAnswerToTheQuestion