我有一个函数要处理的时间会比较长,所以目前考虑用一个进度条来显示正在运行该函数,直到该函数处理完进度条停止。public void Main
{
 achieve = false;
 Thread t = new Thread(new ThreadStart(SetProgress));
 t.Start();
 ArrangeClass() ////此函数运行时间长
 achieve = true;
 MessageBox.Show("运行完毕");
}bool achieve = false;
private int step =1;
public void SetProgress()
{
  while (!achieve)
  {
     if(progressBar1.Position == 100) step = -1;
     else if (progressBar1.Position == 0) step = 1; 
     progressBar1.Increment(step);
//progressBar1.Update();
     Thread.Sleep(20);
  }
}这样做不能达到效果。。边运行函数,边显示进度条。
请问这段代码该做何修改?

解决方案 »

  1.   

    TO icq_power(伯言) :
    能说详细点吗?
      

  2.   

    在工作线程中用事件(或异步委托)通知界面线程(主线程)更新进度条,winform界面控件只能在创建它的线程中(主线程)进行操作,在其他线程中不能直接操作(会有各种意想不到的问题)界面控件。
      

  3.   

    sunyou(砂子) 能给个详细的例子吗?
    或是说说我的程序该如何修改?
      

  4.   

    soulroom(易水之风) :我现在想做的就是个假进程条,就是在某段程序未运行完时,让进度条反复显示的,就像
    Windows的搜索。
      

  5.   

    在SetProgress()不能使用achieve,progressBar1
    ,因为它们是在主线程中声明的,不能在另一个线程中使用
      

  6.   

    参考Chris Sells编写的《Windows Forms程序设计》(C#)。其中有一个多线程的例子,讲得很清楚。
      

  7.   

    http://www.microsoft.com/china/MSDN/library/NetFramework/default.mspx
      

  8.   

    Sorry.应该是这个url:http://www.microsoft.com/china/MSDN/library/archives/library/dnforms/html/winforms08162002
    .asp这个例子很经典。我就是模仿它开发了一个短信收发的程序。
      

  9.   

    {
      Thread timerThread = new Thread(new ThreadStart(ThreadProc));
      timerThread.IsBackground = true;
      arrangeStudent.ArrangeClass();  ///长时间运行
      timerThread.Suspend();
      timerThread.Start();
    }public void ThreadProc() 
    {
    try 
    {
    MethodInvoker mi = new MethodInvoker(this.UpdateProgress);
    while (true) 
    {
    this.BeginInvoke(mi);
    Thread.Sleep(500) ;
    }
    }
    catch
    {}
    }private int step =1;
    private void UpdateProgress() 
    {
    if(bar1.Position == 100) step = -1;  //bar1为进度条progressBar
    else if (bar1.Position == 0) step = 1; 
    bar1.Increment(step);
    }各位请帮我看下这些代码。
    现在线程好像有同时进行,但是progressBar却没有显示。请问这是为何?