如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,
并提示消息:“从不是创建控件 control name 的线程访问它。” 
下面是部分代码
private void Form2_Load(object sender, EventArgs e)
{
            Form2.CheckForIllegalCrossThreadCalls = true;
            Thread t = new Thread(test);
            t.Start();
}
public void test()
{
      //Bitmap b = new Bitmap(@"c:\aaa.bmp");
      // this.pictureBox1.Image = b;      this.textBox1.Text = "sss";
}
在方法test中设置textBox1的Text属性会报出"线程间操作无效: 从不是创建控件“textBox1”的线程访问它。"的错误
而给pictureBox1的Image属性赋值却没有这样的错误,为什么??请高手指点一二.

解决方案 »

  1.   

    跨线程访问窗体,必须要做一些调整,这些帖子你可以从参考:
    http://topic.csdn.net/u/20100503/13/0503b79e-8a17-4ea0-98c0-c7f886c77a8b.html?seed=1691679054&r=65144079#r_65144079
      

  2.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace AccessControl
    {
        public partial class Form1 : Form
        {     
            public Form1()
            {
                InitializeComponent();
            }        private void Form1_Load(object sender, EventArgs e)
            {  
                Thread newthread = new Thread(new ThreadStart(BackgroundProcess));
                newthread.Start();                 }        /// <summary>
            /// 定义一个代理
            /// </summary>
            private delegate void CrossThreadOperationControl();        private void BackgroundProcess()
            {
                // 将代理实例化为一个匿名代理
                CrossThreadOperationControl CrossDelete = delegate()         
                {           
                    int i = 1;
                    while (i<5)
                    {
                       // 向列表框增加一个项目
                        listBox1.Items.Add("Item " + i.ToString());                   
                        i++;
                    }
                    label1.Text = "我在新线程里访问这个lable!";
                    listBox1.Items.Add(label1.Text);
                }  ;
                listBox1.Invoke(CrossDelete);           
            }           }
    }
    //上面是一个类似的代码实现
      

  3.   

    这种方法比较危险一点:
    CheckForIllegalCrossThreadCalls = false;
    禁止:检查非法的跨线程调用
    这个方法最简单,如果没有多个线程同时修改的话,就可以用这个了。
    如果有多个线程修改一个控件,就不能这样了,必须做线程同步!
      

  4.   

    请仔细读题!!!!
    我问的是pictureBox为什么没有这种保护???
    还有,我的结帖率确实惊人!!!
      

  5.   

    pictureBox是线程安全的. 参考
      

  6.   


    官方解释:
    此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。难道窗体上的PictureBox1是静态的??
      

  7.   

    同样的,Label的解释:
    此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。你别告诉我我的Form上的Lable也是静态的.......
      

  8.   


    你把  this.pictureBox1.Refresh();  这个语句试着放上去, 也会出现同样的异常.
      

  9.   

    我就是想知道为什么
    PictureBox1.Image=objImage;
    会没事呢?