先看一段代码    public partial class Form1 : Form
    {
        public delegate void RunProcess();
        public event RunProcess runProcess;        private void button1_Click(object sender, EventArgs e)
        {
            for(;;)
            {
                //这里做一些很耗资源的事情
                runProcess();
            }
        }        public void Run()
        {
            progressBar1.PerformStep();
        }        private void Form1_Load(object sender, EventArgs e)
        {
            runProcess = this.Run;
        }
    }
button1里面的循环做一些很耗资源,很耗时的事情
如果直接在循环里面用progressBar1.PerformStep();那程序会一点反应都没有
我想通过delegage让进度条去跑,不知道这样会不会让界面有反应
在这里请教各位高手

解决方案 »

  1.   

    如果你用delegage
    最好自己写一个后台线程,然后启动它,进行计算,计算的结果通过delegage返回你的窗口
      

  2.   

    大枫的意思是进度条的滚动要让程序通过delegate来实现吗
    不知道这样会不会让界面有反应
      

  3.   

    是我提问的时候太仓促,不应该问delegate是否多线程
    我的意思是能不能通过delegate,让界面从没有反应变得有反应
      

  4.   

    让界面从没有反应变得有反应,与delegate没有关系吧~
      

  5.   

    你可以另外开一个任务线程,另外要在循环体中让它Sleep几十豪秒
      

  6.   

    那要是只用delegate的话,就不能达到我的目标了吗
      

  7.   

    如果我用一个BackgroundWorker组件
    那如何把循环里面的事情跟进度条挂钩呢
      

  8.   

    delegate直接调用的话委托所绑定的方法执行线程和调用者线程还是同一线程, 不过可以用委托的异步调用BeginInvoke,这样就是在新的线程里执行委托所绑定的方法了.
      

  9.   

    UI控件, 比如进度条都应该跑在主线程里(也就是UI线程)而你耗资源的动作就应该开新线程(可以直接用Thread,可以用delegate的异步调用)来执行, 然后在新线程里更新UI控件的状态(比如更新进度条进度)但注意这里不能直接在新线程里操作UI控件(因为有线程同步的安全问题), 而需要使用封送方式, 也就是通过Control.Invoke的方式来操作UI主线程上的UI控件(其实本质就是新线程发送消息到主线程,还是由主线程来控制UI控件)
      

  10.   


    public partial class Form1 : Form
    {
        Thread progress;    public Form1()
        {
            InitializeComponent();
        }    private void Form1_Load(object sender, EventArgs e)
        {
            progress = new Thread(new ThreadStart(Run));
        }    private void button1_Click(object sender, EventArgs e)
        {
            progress.Start();
        }    public void Run()
        {
            for (;;)
            {
                progressBar1.PerformStep();
                //这里做一些很耗资源的事情
            }
        }        }
    这样写能让进度条有反应吗??
      

  11.   

    可以,但在新线程里不能直接调用progressBar1.PerformStep()而要用封送的方式让主线程做操作UI控件,如下:private delegate void ProgressBarPerformStepCallback (ProgressBar textBox)
    private void ProgressBarPerformStep(ProgressBar bar)
    {
          if (bar.InvokeRequired)
          {
               ProgressBarPerformStepCallback d = new ProgressBarPerformStepCallback(ProgressBarPerformStep);
               this.Invoke(d, new object[] { bar });
          }
          else
          {
               bar.PerformStep();            
          }
    }然后在你的public void Run()里调用ProgressBarPerformStep(progressBar1);
      

  12.   

    en
    可以了
    感谢possible_Y
      

  13.   

    楼主啊 BackgroundWorker其实就是使用的后台线程,
    另外,在UI线程之外的其他线程中修改UI元素,比如你的进度条在VS05中有问题的,(编译会报错)
    所以才引入BackgroundWorker