如果代码是在VS2003中的话应该不会抛出这个异常,只有在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常。这是微软为了保证线程安全以及提高代码的效率所做的改进.
private void Form1_Load(object sender, EventArgs e) { //创建线程需要System.Threading命名空间 Thread t1, t2; // 说明为窗体类成员 t1 = new Thread(new ThreadStart(BackgroundProcess)); t1.Start(); //启动线程t1 } /// <summary> /// 定义一个代理 /// </summary> private delegate void dd(); //处理方法 private void BackgroundProcess() { // 将代理实例化为一个匿名代理 dd = delegate() { int i = 1; while (true) { // 向列表框增加一个项目 listBox1.Items.Add("Iterations: " + i.ToString()); i++; Thread.Sleep(2000); // 指定线程休眠的时间 } }; listBox1.Invoke(dd); } 上面这个代码只是在你的代码中声明了一个代理,并且用VS2005中新加的语法(匿名代理,又名匿名方法。)来实例话这个代理,将你在线程中要操作的代码都放到这个匿名的方法中去。然后通过使用控件的Invoke方法(也可以使用控件的BeginInvoke方法——Invoke方法是同步的BeginInvoke方法是异步的)来调用这个代理。当然在Invoke方法中你也可以输入任何形式的代理。通过这种方式调用的代码就不会抛出你出现的那个异常了。 |