首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

关于使用BackgroundWorker多条线程怎么控制暂完成和暂停

2013-03-21 
关于使用BackgroundWorker多条线程如何控制暂完成和暂停下面的代码,界面开启运行后,点启动后,完成后能正确

关于使用BackgroundWorker多条线程如何控制暂完成和暂停
下面的代码,界面开启运行后,点启动后,完成后能正确输出操作完成,点击启动后立即暂停也是能正确输出操作暂停

问题在于点启动后,再点暂停,再点启动,等完成后不会输出操作完成
点启动后,再点暂停,再点启动,再点暂停也是不能输出操作暂停

请问下面代码问题出在哪里,怎么修改才能正确输出。


List<BackgroundWorker> bw = new List<BackgroundWorker>();
        int t = 10;
        int c = 1;

        public Form2()
        {
            InitializeComponent();

            for (int i = 0; i < t; i++)
            {
                bw.Add(new BackgroundWorker());
                bw[i].WorkerSupportsCancellation = true;
                bw[i].DoWork += new DoWorkEventHandler(bw_DoWork);
                bw[i].RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
            }
        }

        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (c++ == t)
            {
                if (e.Cancelled)
                {
                    this.richTextBox1.Text += "操作暂停!"; ;
                }
                else
                {
                    this.richTextBox1.Text += "操作完成!";
                }
            }
        }

        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            int j = Convert.ToInt32(e.Argument);

            for (int i = j; i < 100; i = i + t)
            {

                if (((BackgroundWorker)sender).CancellationPending)


                {
                    e.Cancel = true;
                    return;
                }

                string s1 = DateTime.Now.ToString("hh:mm:ss");
                string s2 = (j+1).ToString();

                this.Invoke((MethodInvoker)delegate
                {
                    this.richTextBox1.Text += String.Format("时间:{0}-线程:{1}-数据:{2}", s1, s2, i) + Environment.NewLine;
                });
                System.Threading.Thread.Sleep(200);
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = false;
            this.button2.Enabled = true;

            this.richTextBox1.Text = String.Empty;

            this.RunWorkerAsync();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = true;
            this.button2.Enabled = false;

            this.CancelAsync();
        }

        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            RichTextBox textbox = (RichTextBox)sender;

            textbox.SelectionStart = textbox.Text.Length;
            textbox.SelectionLength = 0;
            textbox.ScrollToCaret();
        }

        private void RunWorkerAsync()
        {
            for (int i = 0; i < t; i++)
            {


                bw[i].RunWorkerAsync(i);
            }
        }

        private void CancelAsync()
        {
            for (int i = 0; i < t; i++)
            {
                bw[i].CancelAsync();
            }
        }


[解决办法]
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
   //处理
   object[] argumet = (object[])e.Argument;
   int rowIndex = (int)argumet[0];//处理到第几条命令
   ...
   //返回进度
   backgroundWorker1.ReportProgress(rowIndex, new object[] {... });
   //返回结果
   e.Result = new object[] { rowIndex, ...};
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  //显示进度情况
   ...
}
//完成一次处理
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //接收返回的结果
    object[] argumet = (object[])e.Result;
    int rowIndex = (int)argumet[0];
    rowIndex = rowIndex + 1;//累计加1
    ....
    //判断是否已完成所以命令,在这里也可以加上暂停的判断if (rowIndex < _rowcount && !isStop)
    if (rowIndex < _rowcount)
    {
           object argumet2 = new object[] { rowIndex, .. };
           backgroundWorker1.RunWorkerAsync(argumet2);//处理下一条信息
    }
}


//第一次执行

            
            object argumet2 = new object[] { 0, .. };
           backgroundWorker1.RunWorkerAsync(argumet2);//处理下一条信息

热点排行