Хотите использовать Task Parallel Library с отчетами о проделанной работе для обновления базы данных

Я разработал приложение, в котором хранятся несколько строк подключения. я просто повторяю цикл for и соединяю каждую базу данных и выполняю sql против каждой базы данных. таким образом, я обновляю несколько баз данных с помощью массового оператора SQL.

Теперь мне нужно использовать Task Parallel Library для одновременного обновления нескольких дБ вместо обновления один за другим в цикле. Я также хочу обработать исключение, а также хочу показать несколько индикаторов выполнения для нескольких операций базы данных. Пауза & функциональность резюме должна быть там.

когда я нажму на кнопку, то будет открыто несколько подключений дб, и для каждой задачи будет добавлен новый индикатор в моей форме. каждый индикатор выполнения будет отображать ход выполнения каждой дБ. когда любая задача будет завершена, соответствующий индикатор выполнения будет удален из формы.

любой может подсказать мне пример кода, как это сделать с помощью TPL. здесь я получил один код, который обновляет один индикатор, но мне нужно обновить несколько индикаторов. int iterations = 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++; });   
    });   
}); 
ОБНОВЛЕНИЕ Вопрос

Я сделал это таким образом. код работает, но все значения индикатора выполнения увеличиваются последовательно. У меня есть одна форма и один пользовательский элемент управления в приложениях winform. пожалуйста, посмотрите на мой код и скажите, что там не так.

главное для кода
public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            Progress ucProgress = null;
            Dictionary dicList = new Dictionary();
            dicList.Add("GB", "conn1");
            dicList.Add("US", "conn2");
            dicList.Add("DE", "conn3");
            fpPanel.Controls.Clear();

            Task.Factory.StartNew(() =>
            {
                foreach (KeyValuePair 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);
            }
        }
    }
код управления пользователем
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   
        }
    }

Ответы на вопрос(1)

Ваш ответ на вопрос