下面代码  2个线程  一个加点  一个刷新  调用同一控件 报错 "集合已修改;可能无法执行枚举操作。"  
请问应该怎么修改?  放在同一线程 会造成加点太少  
另外问下 windows最快刷新频率大约多少毫秒?
public Form1()
        {
            InitializeComponent();            chart1.Series["Series1"].Color = Color.Lime;
            chart1.Series["Series1"].Points.AddXY(0, 0);            Thread t1 = new Thread(DrawQuxian);
            t1.Start();            Thread t2 = new Thread(FlashQuxian);
            t2.Start();
        }        int i = 0;
        private void DrawQuxian()
        {
            while (true)
            {
                //拿点要求10毫秒以内
                this.chart1.Series["Series1"].Points.AddXY(i, i%10);
                i++;
                Thread.Sleep(10);
            }
        }        private void FlashQuxian()
        {
            while (true)
            {
                try
                {
                    if (this.chart1.InvokeRequired)
                    {
                        this.Invoke((EventHandler)(delegate
                        {
                            //刷新要求1000毫秒以内
                            this.chart1.Invalidate();
                        }));
                    }
                }
                catch
                {                }                Thread.Sleep(1000);
            }    
        }

解决方案 »

  1.   

            bool flag;
            private void button1_Click(object sender, EventArgs e)
            {
                flag = false;
                Thread thread = new Thread(new ThreadStart(target));
                thread.IsBackground = true;
                thread.Start();
                progressBar1.Maximum = 100;
                Thread threada = new Thread(new ThreadStart(target));
                threada.IsBackground = true;
                threada.Start();
                progressBar1.Maximum = 100;
            }        public void target()
            {
                MethodInvoker mi = new MethodInvoker(countPro);
                while (!flag)
                {
                    this.Invoke(mi);
                    
                    Thread.Sleep(100);
                }        }
      

  2.   

            public void countPro()
            {
                int min;
                double numerator, denominator, completed;
                min = this.progressBar1.Minimum;
                if (this.progressBar1.Value == this.progressBar1.Maximum)
                {
                    this.progressBar1.Value = this.progressBar1.Minimum;
                }
                else
                {
                    this.progressBar1.PerformStep();
                }
                //显示进度
                this.textBox1.Text = this.progressBar1.Value.ToString();
                numerator = this.progressBar1.Value - min;
                denominator = this.progressBar1.Maximum - this.progressBar1.Minimum;
                completed = (numerator / denominator) * 100.0;
                this.label2.Text = Math.Round(completed) + "%";
            }
      

  3.   

    1楼的方法可行。lz到MSDN查查,有这方面的例子
      

  4.   

     this.chart1.Series["Series1"].Points.AddXY(i, i%10);
    放到Invoke里去做
    操作Series的代码全部回主线程操作即可。
      

  5.   

    可以锁定集合的SyncRoot,不仅要在DrawQuxian内添加,在绘图函数内亦要将对集合的整个枚举过程包起来
      

  6.   

    一个是要对共享数据进行同步,另外最好不要用Thread.Sleep()方法来控制刷新频率,使用个定时器