顶上 public partial class Form1 : Form
    {
        public delegate void WorkHandler(int x);

解决方案 »

  1.   

    那就是与你  定义的WorkHandler 中的参数数量不一致,检查是不是少传入参数了。
      

  2.   

    这么复杂,直接progressBar1.Value=i;不行吗
      

  3.   

    如果要显示百分比,建议使用backgroundworker,参见:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker(v=vs.110).aspx
      

  4.   

    哦,在线程里不可以直接访问UI控件
    改成这样
                for (int i = 0; i < 100; i++)            {                Thread.Sleep(100); 
                    this.Invoke(new Action<int>(this.UpdateProgress), i);
              }      private void UpdateProgress(int v)        {                      this.progressBar1.Value = v;    }
      

  5.   

    定义的里只有传入一个参数的呀
    这个提示是说Invoke函数参数不匹配,因为托管代理定义了一个参数,所以Invove函数要指定第二个参数this.Invoke(托管对象,第二个参数); //第二个参数实际就是托管对象的参数
      

  6.   

    Quote: 引用 6 楼 gxingmin 的回复:

    哦,在线程里不可以直接访问UI控件
    改成这样
                for (int i = 0; i < 100; i++)            {                Thread.Sleep(100); 
                    this.Invoke(new Action<int>(this.UpdateProgress), i);
              }
    在线程里是不可以直接访问UI控件,用了lambda其实也相当于是委托访问的吧。不传参的 直接progressBar1.Value = i是可以的  但是我就是不明白放个传个参数为什么就不对了
      

  7.   

    定义的里只有传入一个参数的呀
    这个提示是说Invoke函数参数不匹配,因为托管代理定义了一个参数,所以Invove函数要指定第二个参数this.Invoke(托管对象,第二个参数); //第二个参数实际就是托管对象的参数
    ok  已明白
     progressBar1.Invoke(new WorkHandler((x) => { x = i; progressBar1.Value = x; }),i);
      

  8.   

    而且你的x=i;这个语句是完全没有道理的
    x是你自己定义的,i是从哪来的?
    i并不是一个全局变量,你需要把它传递给x
    所以应该是Invork(lamada,i)这样传递进去
    而不是在函数体里面使用i
      

  9.   

    (x) => { x = i; progressBar1.Value = x; }不要把这个东东想象的太神奇
    它不过就是个语法糖,相当于
    void f(int x)
    {
    progressBar1.Value = x;
    }
    而已
    你不要在f这个函数里直接使用i啊
      

  10.   


    恩  知道啦 progressBar1.Invoke(new WorkHandler((x) => { x = i; progressBar1.Value = x; }),i); 这样就对了