请大家看看我错到哪了。
       public delegate void UpdateMsgDelegate(int msg);//首先声明一个委托类型 
        UpdateMsgDelegate myDelegate;//声明该委托类型的成员 
        int finish = 0;//判断执行的进度 0,开始 1 结束 private void button1_Click(object sender, EventArgs e)
        {
            //点击按钮。
            myDelegate = new UpdateMsgDelegate(UpdateMsg);//委托与方法挂钩 
            Thread t = new Thread(new ThreadStart(doSomeThing));//新开线程 
            t.Start();//线程启动 
            finish = 0;//操作开始
          //中间是耗时操作 ,从sql读数据,写入excel
           finish = 1;//操作完毕        }
         private void doSomeThing()
        {
            if (progressBar1.InvokeRequired)//如果跨线程调用 
            {
                this.progressBar1.Invoke(myDelegate, new object[] { finish });//Invoke委托方法 
            }
        }        private void UpdateMsg(int p)//这个是委托方法。 
        {
            while(finish == 0)
            {                this.progressBar1.Value += 2;
            }
        } 
发现没什么作用....不报错,但是执行耗时操作的时候进度条控件是不变的。调试发现在委托方法UpdateMsg判断时 finish已经为1了。也就是说耗时操作结束了这个方法才起作用。求教如何解决

解决方案 »

  1.   

         finish = 1;//这个应该放在
       private void doSomeThing()
            {
                if (progressBar1.InvokeRequired)//如果跨线程调用 
                {
                    this.progressBar1.Invoke(myDelegate, new object[] { finish });//Invoke委托方法 
                }
            }耗时操作结束后
      

  2.   

     finish = 0;//操作开始
              //中间是耗时操作 ,从sql读数据,写入excel
               finish = 1;//操作完毕
    这中间的代码呢??。。没看到中间还有东西
      

  3.   


     finish = 0;//操作开始
              //中间是耗时操作 ,从sql读数据,写入excel
               finish = 1;//操作完毕
    中间就是耗时操作。他是放在这个操作后面的
      

  4.   

    中间的代码如下Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
                //创建了一个对象。用来对excele操作
                int rowIndex = 1;//行的起始是1而不是0
                int colIndex = 0;//行,列
                excel.Application.Workbooks.Add(true);
                //Creates a new workbook. The new workbook becomes the active workbook. Returns a Workbook object. 
                System.Data.DataTable table = GetData(); //填充table
                foreach (DataColumn col in table.Columns)
                {
                    colIndex++;
                    excel.Cells[1, colIndex] = col.ColumnName;//将sql内每列的名称赋给eccel的第一行的单元格
                }
                foreach (DataRow row in table.Rows)
                {
                    rowIndex++;//第一次是从2开始
                    colIndex = 0;//重新赋值
                    foreach (DataColumn col in table.Columns)
                    {
                        colIndex++;
                        excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                    }
                }
                Worksheet ws = (Worksheet)excel.ActiveSheet;            excel.Visible = true;
      

  5.   

    是不是你的耗时操作时间太短了。。你在finish=0

    finish=1之间加上Thread.sleep(10000);这样试试呢
      

  6.   

    调试发现 doSomeThing()函数执行时 finish的值还是0,但是第一次执行UpdateMsg()的时候就成1了。是不是我invoke函数或者多线程操作哪里出了毛病?但是我一直检查不出来。另外这个操作很耗时。
           
      

  7.   

    找不着原因,不行就先用 Control.CheckForIllegalCrossThreadCalls = False 吧。
    加在 form_load中就行,也就可以不用委托了。呵呵
      

  8.   

    invoke内传递的委托的调用机制是什么样的?
    为什么处理耗时操作前invoke调用 而操作后才轮到委托的函数?另外发现这个忘记写sleep了不过测试了一下依旧没什么改变。
      

  9.   

    你在finish=0
    finish=1的时候,加上日志,
    然后在线程处理的地方加上日志,这样就只是调用顺序了
      

  10.   

    finish = 0;
    finish = 1;中存在问题,解决这个问题的时候,应该首先获得你需要写入的数据条数,设置为progressbar 的 MaxValue,然后写过一条以后在 progressbar.Value 加一。楼主处理问题的方式有些那个...就问题说问题的话,这个问题在于你在主进程里面写的耗时操作,程序在不运行完 button click 时不会执行下面的操作(比如说重画界面),即使你在另外一个线程里面更改值也不会画到界面上,所以说,把耗时操作放在线程里面才是正解
      

  11.   

        finish = 0;//操作开始
        finish = 1;//操作完毕
    这个应该在线程里面完成才对.
      

  12.   

    恩 放在线程里就OK了。原来这么简单。也感谢 wzuomin 让我知道了一个简单的新方法。