已经会使用BackgroundWorker增加后台线程,但问题是只有一个线程,访问1到1000要好几秒,速度还不会很快,我想利用BackgroundWorker增加线程,1秒之内搞定,请问如下代码如何改造呢?
BackgroundWorker bw = null;        public Form5()
        {
            InitializeComponent();            bw = new BackgroundWorker();
            bw.WorkerSupportsCancellation = true;
            bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
        }        void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i < 1000; i++)
            {
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }                this.Invoke((MethodInvoker)delegate
                {
                    this.ShowText(String.Format("第{0}步正在执行", i));
                });
            }
        }        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.ShowText("执行完毕!");
        }        private void button1_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = false;
            this.button2.Enabled = true;            bw.RunWorkerAsync();
        }        private void button2_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = true;
            this.button2.Enabled = false;            bw.CancelAsync();
        }        private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            RichTextBox textbox = (RichTextBox)sender;            textbox.SelectionStart = textbox.Text.Length;
            textbox.ScrollToCaret();
        }        void ShowText(string text)
        {
            this.richTextBox1.Text += text + Environment.NewLine;
        }

解决方案 »

  1.   

    百度没封杀你?使用线程池for (int i = 0; i < 20; i++)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i);
                }      
      

  2.   

    谢谢楼上,不过感觉没有快多少,都开20个线程了,还是我代码有问题?
    private void button1_Click(object sender, EventArgs e)
            {
                this.button1.Enabled = false;            for (int i = 0; i < 20; i++) 
                { 
                    ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), i); 
                }
            }        void DoWork(object o)
            {
                int j = Convert.ToInt32(o) * 50;            for (int i = j; i < j + 50; i++)
                {
                    this.Invoke((MethodInvoker)delegate
                    {
                        this.ShowText(String.Format("第{0}个线程执行{1}步!", o, i));
                    });
                }
            }
      

  3.   

    你没有20个CPU核心的话,线程开得越多越慢!