namespace WindowsForm
{
    public partial class Form1 : Form
    {
        public delegate void changeProgress(int current);
        public Form1()
        {
            InitializeComponent();
        }        private void button1_Click(object sender, EventArgs e)
        {
            begin b = new begin();
            b.Go();
        }
        public  void progressChange(int current)
        {
            progressBar1.Value = current;
        }
    }
}namespace WindowsForm
{
    public class begin
    {
        public void Go()
        {
            Form1 fom1 = new Form1();
            WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange);
            for (int i = 1; i < 100; i++)
            {
                Console.WriteLine(i.ToString());
                cp.BeginInvoke(i, null, null);
                Thread.Sleep(1);
            }
        }    }
}
为什么滚动条没有变化。

解决方案 »

  1.   

    怎么看怎么像是两个类在互相掉!Form1 fom1 = new Form1(); 
                WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange); 实例化了一个Form1,应该不会再原来的画面中表示出来吧,而是在新的画面实例中吧!
      

  2.   

    大致是因为界面的更新等等操作都是要在主线程里完成的
    在你的程序里,b.Go 的调用将主线程阻塞住了,当然不会变化了
    而且,在你使用 BeginInvoke 调用 progressChange 的时候,在另一个线程中为 progressBar1.Value 赋值
    不清楚 WinForm 具体是怎么规定的,但在大多数图形界面中,这种做法是有害的
    例如,在 WPF 中,这种做法(在另一个线程中改变控件属性)会报错,告诉你不能这么做
      

  3.   

    貌似是button_click事件里面没有等异步结束的
      

  4.   

    Form1 fom1 = new Form1(); 
                WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange); 你的委托是基于一个没有show过的新form1,怎么能期待在当前的form1上体现出来效果
      

  5.   

    Form1 fom1 = new Form1(); 
      

  6.   

    C# 不允许 夸线程访问控件, 从你的代码可以看出 是想做进度条 , 委托可以实现  网上的例子很多  你可以 google 一下
      

  7.   

    把Form1修改如下:
     public  void progressChange(int current) 
            { 
                this.Invoke(new MethodInvoker(delegate()
                {

                    progressBar1.Value = current;
                }));
            } Begin类修改:
    public class begin 
        { 
            public void Go() 
            { 
                Form1 fom1 = new Form1(); 
                form1.Show();
                WindowsForm.Form1.changeProgress cp = new Form1.changeProgress(fom1.progressChange); 
                for (int i = 1; i < 100; i++) 
                { 
                    Console.WriteLine(i.ToString()); 
                    //cp.BeginInvoke(i, null, null); 
                     fom1.Invoke(cp, i);
                    Thread.Sleep(1); 
                } 
            }     } 
      

  8.   

    如果你是想在那个窗体里面,点击button1时,进度条数据处理进度情况。
    你begin类应该是处理数据的吧?那你的委托应该定义在begin里面
    如下:
     public class begin
        {
            public delegate void changeProgress(int current);        public changeProgress changedProgressed;        public void Go()
            {           for (int i = 1; i < 100; i++)
                {
                    Console.WriteLine(i.ToString());
                    if (changedProgressed != null)
                    {
                        changedProgressed(i);
                    }
                    Thread.Sleep(1);
                }
            } } 你的form里面是这样的
            private void button1_Click(object sender, EventArgs e)
            {
                begin b = new begin();
                b.changedProgressed = new begin.changeProgress(this.progressChange);
                b.Go();         }        public void progressChange(int current)
            {
                //this.Invoke(new MethodInvoker(delegate()//这里就可以不要了
                //{
                    progressBar1.Value = current;
               // }));
           } 
      

  9.   

    这里需要注意的是,对Graphics的操作必须在同一个线程里,所以需要使用InvokeRequired判断和,使用Invoke操作
     private void button1_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(Test);
                thread.Start();        }        private void Test()
            {
                for (int i = 0; i <= 100; i++)
                {
                    Thread.Sleep(100);
                    progressChange(i);
                }        }        public delegate void ChangedHandle(int current);        public void progressChange(int current)
            {
                if (this.progressBar1.InvokeRequired)//判断是不是在同一个线程里
                {
                    ChangedHandle p = new ChangedHandle(progressChange);
                    this.progressBar1.Invoke(p, new object[] { current });
                }
                else
                {
                    this.progressBar1.Value = current;
                }
            }