none
WPF更新进度条 RRS feed

  • 问题

  • LZ最近在做群发email的软件,现在就差一个UI界面的更新了,然后LZ照着网上的例子写了下,抓狂啊,就是不会更新,下面是大致的代码

     private delegate void update_ui(int i, int num); //这应该是委托

     update_ui update_ui_handler;

           private void change(int i, int num)
           {
               try
               {
                   update_ui_handler = new update_ui(update);
                   progressbar.Dispatcher.BeginInvoke(update_ui_handler,i,num);
               }
               catch (Exception ex)
               {}
           }


           private void update(int i, int num)
           {
               progressbar.Value = 100 * i / num;
           }

     private void btn_click(object sender, RoutedEventArgs e)
            {

     for (int i = 0; i < num; i++) //num是email总数
                    {
                        send_email();//发送email

                        change(i, num);//更新UI
                    }

    }

    是不是我把更新UI的函数放到for循环就不行了?

    求各位高手赐教

    2012年3月19日 12:09

答案

全部回复

  •    

        既然是在 button 的 click 事件里面写,那么这个函数是在 UI 线程上执行的。没有跨线程,同时也没必要用 BeginInvoke,在 for 循环里面,

    send_email() 完后直接写 progressbar.Value = 100 * i / num,直接跟新进度条就完了。你这样写就涉及到调度问题了, click 函数在执行的

    过程中每执行一次 send_email(),就会生成一个要执行 update函数的委托,然后丢到执行队列里,等这个 for 循环结束,退出这个函数,再去执

    行那 100个 update,因为执行的很快,所以如果你耐心等待,你会看到最后一个结果直接跳了出来。

        后来我为了去验证这个问题,我写了一个代码:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < 100; i++)
                {
                    // 企图使用 Sleep 将线程睡着 0.2 秒,模仿一个耗时的操作
                    Thread.Sleep(200);
                    // 执行完耗时操作后,更改进度条
                    this.progress_bar.Value = i;
                }
            }

         可是问题出来了,界面没反应,过了 20 秒,进度条进度显示 100....

         求解释...


    2012年3月19日 14:26
  • 谢谢兔子不乖的解释, 但是问题还是木有解决(抓狂中),在最开始我就在send_email()后面直接更新 progressbar 发现无用, 刚才又试了个新方法,用了DispatcherTimer 可貌似还是不行 

     DispatcherTimer dt = new DispatcherTimer(); 
     private double pecentage = 0.0;
    
    
    //窗口加载
    public send()
            {
                InitializeComponent();
                dt.Interval = new TimeSpan(0, 0, 0, 0, 1);
                dt.Tick += new EventHandler(dt_Tick);
            }
    
     private void dt_Tick(object sender, EventArgs e)
            {
                progressbar.Value = pecentage;
                
            }
    
    private void btn_click(object sender, RoutedEventArgs e)
            {
                for (int i = 0; i < num; i++)
                    {
                        send_email();
                        pecentage = Convert.ToDouble(i) / Convert.ToDouble(num);
                        
                    }
                
            }

    求教ing


    • 已编辑 orangeii 2012年3月19日 15:36
    2012年3月19日 15:17
  • ?????
    • 已标记为答案 orangeii 2012年3月19日 20:57
    • 已编辑 Shi Xin 2015年7月27日 7:56
    2012年3月19日 17:23
  •    脑子发热,忘记了UI的跟新要等到这个函数结束。呵呵,谢谢 shixin
    2012年3月20日 13:23
  • I really want to ssy "Thanks!" 

    BestRegards

    2013年1月9日 7:19