原函数代码为:       
public void fun()//在线程中执行的方法,必须为公有void类型方法,不能有参数。
{
  while(true)//死循环,线程将一直运行
  {
    int x = Convert.ToInt16(label1.Text);
    x++;
    label1.Text=Convert.ToString(x);
    thread.Join(1000);//休眠1秒钟,休眠一次,线程运行了1秒钟
   }
}     
错误:-----线程间操作无效: 从不是创建控件“label1”的线程访问它。然后查到可以使用委托:修改如下:
       private Thread thread;
        delegate void SetValueEventHandler(Label label, int num);
        void SetValueEvent(Label label, int num)
        {
            label.Text = Convert.ToString(num);
        }        public void fun()//在线程中执行的方法,必须为公有void类型方法,不能有参数。
        {
            while(true)//死循环,线程将一直运行
            {
                int x = Convert.ToInt16(label1.Text);
                x++;
                Invoke(new SetValueEventHandler(********code need*************));
                //label1.Text = Convert.ToString(x);
                thread.Join(1000);//休眠1秒钟,休眠一次,线程运行了1秒钟
            }
        }        private void button1_Click(object sender, EventArgs e)
        {
            thread= new Thread(new ThreadStart(fun));//生成线程类对象
            label1.Text="0";
            thread.Start();
            button1.Enabled=false;
            button2.Enabled=true;
            button3.Enabled=false;
            button4.Enabled=true;
        }
当:Invoke(new SetValueEventHandler(label1,x));---------------错误提示为"应输入方法".
********code need**************中应该怎么样写委托的参数,谢谢!

解决方案 »

  1.   

    http://hi.baidu.com/xtzz/blog/item/65b21dd1afa5093b9b502780.html
      

  2.   

    private int num=0;
    delegate void dSetValueEventHandler();
    dSetValueEventHandler SetValueEventHandler;void SetValueEvent()
    {
        label.Text = Convert.ToString(num);
    }public void fun()//在线程中执行的方法,必须为公有void类型方法,不能有参数。
            {
                while(true)//死循环,线程将一直运行
                {
                    int x = Convert.ToInt16(label1.Text);
                    x++;
                    num=x;
                    this.BeginInvoke(SetValueEventHandler); //调用该方法
                    //label1.Text = Convert.ToString(x);
                    thread.Join(1000);//休眠1秒钟,休眠一次,线程运行了1秒钟
                }
            }
    private void button1_Click(object sender, EventArgs e)
            {
    SetValueEventHandler=new dSetValueEventHandler(SetValueEvent); //实例化该委托
                thread= new Thread(new ThreadStart(fun));//生成线程类对象
                label1.Text="0";
                thread.Start();
                button1.Enabled=false;
                button2.Enabled=true;
                button3.Enabled=false;
                button4.Enabled=true;
            }
      

  3.   

    msdn里Control.Invoke的例子
    using System;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Threading;   public class MyFormControl : Form
       {
          public delegate void AddListItem(String myString);
          public AddListItem myDelegate;
          private Button myButton;
          private Thread myThread;
          private ListBox myListBox;
          public MyFormControl()
          {
             myButton = new Button();
             myListBox = new ListBox();
             myButton.Location = new Point(72, 160);
             myButton.Size = new Size(152, 32);
             myButton.TabIndex = 1;
             myButton.Text = "Add items in list box";
             myButton.Click += new EventHandler(Button_Click);
             myListBox.Location = new Point(48, 32);
             myListBox.Name = "myListBox";
             myListBox.Size = new Size(200, 95);
             myListBox.TabIndex = 2;
             ClientSize = new Size(292, 273);
             Controls.AddRange(new Control[] {myListBox,myButton});
             Text = " 'Control_Invoke' example ";
             myDelegate = new AddListItem(AddListItemMethod);
          }
          static void Main()
          {
             MyFormControl myForm = new MyFormControl();
             myForm.ShowDialog();
          }
          public void AddListItemMethod(String myString)
          {
                myListBox.Items.Add(myString);
          }
          private void Button_Click(object sender, EventArgs e)
          {
             myThread = new Thread(new ThreadStart(ThreadFunction));
             myThread.Start();
          }
          private void ThreadFunction()
          {
             MyThreadClass myThreadClassObject  = new MyThreadClass(this);
             myThreadClassObject.Run();
          }
       }
       public class MyThreadClass
       {
          MyFormControl myFormControl1;
          public MyThreadClass(MyFormControl myForm)
          {
             myFormControl1 = myForm;
          }
          String myString;      public void Run()
          {
             for (int i = 1; i <= 5; i++)
             {
                myString = "Step number " + i.ToString() + " executed";
                Thread.Sleep(400);
                // Execute the specified delegate on the thread that owns
                // 'myFormControl1' control's underlying window handle with
                // the specified list of arguments.
                myFormControl1.Invoke(myFormControl1.myDelegate,
                                       new Object[] {myString});
             }
          }
       }
      

  4.   

    谢谢,解决!        private void change()
            {
                int x = Convert.ToInt16(label1.Text);
                    x++;
                label1.Text = Convert.ToString(x);
            }
            public void fun()//在线程中执行的方法,必须为公有void类型方法,不能有参数。
            {
                while (true)//死循环,线程将一直运行
                {
                    
                     MethodInvoker In = new MethodInvoker(change);
                     this.BeginInvoke(In);
                     thread.Join(1000);//休眠1秒钟,休眠一次,线程运行了1秒钟
                }
            }
            //---------------------------------------------------------
            private void button1_Click(object sender, EventArgs e)
            {
                thread = new Thread(new ThreadStart(fun));//生成线程类对象
                label1.Text = "0";
                thread.Start();
                button1.Enabled = false;
                button2.Enabled = true;
                button3.Enabled = false;
                button4.Enabled = true;
            }