这是一个生成50个质数的小程序,用一个线程实现它.
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private Thread primeThead; 
        private void btnStart_Click(object sender, EventArgs e)
        {
            primeThead = new Thread(new ThreadStart(Generate));
            primeThead.Name = "质数";
            primeThead.Start();
        }
        private void Generate()//这个方法用来生成50个质数
        {
            bool isPrime = true;
            int count = 2;
            lstPrime.Items.Add(2);//提示这里出错了
            for (int i = 3; count < 50; i++)
            {
                isPrime = true;
                for (int j = 2; j <= (i / 2);j++ )
                {
                    if (i % j == 0)
                    {
                        isPrime = false;
                        break;
                    }
                }
                if (isPrime)
                {
                    lstPrime.Items.Add(i);
                    count++;
                    Thread.Sleep(100);
                }
            }        }
    }出现错误提示->线程间操作无效: 从不是创建控件“lstPrime”的线程访问它
请问怎么改上面的这段代码啊?    不调试直接运行,结果正常;用调试按调就出错

解决方案 »

  1.   

    private void Generate()//这个方法用来生成50个质数
            {
               if(this.InvokeRequired)
                {
                     this.Invoke(new MethodInvoker(Generate),null);
                 }
                 else
               {
                bool isPrime = true;
                int count = 2;
                lstPrime.Items.Add(2);//提示这里出错了
                for (int i = 3; count < 50; i++)
                {
                    isPrime = true;
                    for (int j = 2; j <= (i / 2);j++ )
                    {
                        if (i % j == 0)
                        {
                            isPrime = false;
                            break;
                        }
                    }
                    if (isPrime)
                    {
                        lstPrime.Items.Add(i);
                        count++;
                        Thread.Sleep(100);
                    }
                }
              }
            }
      

  2.   

    你遇到的应该是两个问题:
    1、新开线程修改主线程控件属性为什么要报错?
      答:vs2003时,这种情况是不报错的,vs2005时,微软不建议这样处理。
        方法一:VS2003兼容方法处理,如下:
            public Form1()
                {
                    InitializeComponent();
              Control.CheckForIllegalCrossThreadCalls = false;
                }
        方法二:微软建议作法,使用委托来修改主线程控件的属性。
    2、线程中调试为什么要出错?
      答:新开线程的处理部份,如你的Generate(),与主线程在同一个类中,调试会出错,如果将Generate()放在另一个类中,你调试就不会出错了,VS2005就有这个问题,不知道微软是怎么考虑的。立即成为编程经验丰富的程序员不是梦,详见:http://www.psec.net.cn