public partial class Form1 : Form  //主窗体
    {
        private Thread THcon;//声明一个全局变量的线程
        List<string> list = new List<string>(); //声明一个数组        public Form1()
        {
            InitializeComponent();
            
        }
        int i = 0;        private void button1_Click(object sender, EventArgs e)//button1事件 用于像
        {            listBox1.Items.Add(i);
            i += 1;
            THcon = new Thread(new ThreadStart(trust));
            THcon.Start();
            string State = THcon.ThreadState.ToString();
        }
    
        public void trust()//声明一个委托,目的是利用委托让子线程能够操作Form1中的控件
        {
            consum_class con = new consum_class();
            MethodInvoker mi = new MethodInvoker(con.consum);//声明一个委托listBox1中添加数字
            this.Invoke( mi);        }
    }
  public class consum_class  //创建一个消费者类,功能是将listBox1中的值放入listBox2中
        {
            public void consum()
            {
                lock (this)
                {   
                    if (listBox1.Items.Count == 0)
                    {
                        return;                    }
                    while (true)
                    {
                        int q = 0;
                        for (int j = 0; j < listBox1.Items.Count; j++)//跟新队列栈
                        {
                            string State = THcon.ThreadState.ToString();
                            list.Add(this.listBox1.Items[j].ToString());
                        }                        string b = list.Last();
                        for (int i = 0; i < 10000000; i++)//为了看清线程的运转过程,我故意做了个循环,延长了线程的取值时间
                        {                            q += 1;
                            if (q == 10000000)
                            {
                                this.listBox2.Items.Add(b);
                                break;
                            }
                        }
                        break;
                    }
                }
            }
        }
    }
问题是使用了委托 也不能引用控件哦错误 CS0103: 当前上下文中不存在名称“listBox1”
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(58,45): 错误 CS0103: 当前上下文中不存在名称“listBox1”
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(60,44): 错误 CS0103: 当前上下文中不存在名称“THcon”
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(61,29): 错误 CS0103: 当前上下文中不存在名称“list”
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(61,43): 错误 CS1061: “dotNetAndThread2.consum_class”不包含“listBox1”的定义,并且找不到可接受类型为“dotNetAndThread2.consum_class”的第一个参数的扩展方法“listBox1”(是否缺少 using 指令或程序集引用?)
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(64,36): 错误 CS0103: 当前上下文中不存在名称“list”
C:\Documents and Settings\test\My Documents\Visual Studio 2008\Projects\dotNetAndThread2\dotNetAndThread2\Form1.cs(71,38): 错误 CS1061: “dotNetAndThread2.consum_class”不包含“listBox2”的定义,并且找不到可接受类型为“dotNetAndThread2.consum_cla

解决方案 »

  1.   

    跨线程invoke
    private delegate void CopyListItemCallBaCk();private void button1_Click(object sender, EventArgs e)
    {
    Thread t = new Thread(new ThreadStart(CopyListItem));
    t.Start();
    }private void CopyListItem()
    {
    if (this.listBox1.InvokeRequired || this.listBox2.InvokeRequired) {
    CopyListItemCallBaCk cb = new CopyListItemCallBaCk(CopyListItem);
    this.Invoke(cb);
    } else {
    listBox2.Items.Clear();
    foreach (object o in listBox1.Items) {
    listBox2.Items.Add(o);
    }
    }
    }
      

  2.   


    if(this.InvokeRequired)
    {
       this.invoke()
    }
    else 
    {}
      

  3.   

    MethodInvoker mi = delegate
                                       {
                                           control.Text = "test";
                                       };
                if (control.InvokeRequired)
                {
                    control.Invoke(mi);
                }
                else
                {
                    mi();
                }
    希望有所帮助
      

  4.   


    2楼我不光是跨线程那么简单了  我的“消费者”是在另一个类里(public class consum_class),和“Form”窗体对象不是在一个类里哦。