c#实时显示任务进度条

界面大致这样。在点击开始后,有一个长任务要执行,执行过程中需要实时显示进度条和label1显示百分比。我希望的是进度条的进度能根据我以下这个for循环来更新,因为这个fo... 界面大致这样。
在点击开始后,有一个长任务要执行,执行过程中需要实时显示进度条和label1显示百分比。
我希望的是进度条的进度能根据我以下这个for循环来更新,因为这个for循环每次要执行很长的时间,所以要没循环一次,进度条值+1。
也就是progressBar的maxnum=n;
int n=100;
for(int i=0;i<n;i++)
{
……
//在这过程中需要执行很久
……
}
线程相关的没学好,求各位给下代码,万分感谢
展开
 我来答
freeeeeewind
2014-03-08 · TA获得超过1万个赞
知道大有可为答主
回答量:3227
采纳率:94%
帮助的人:1299万
展开全部
public partial class MainWindow : Window
    {
 
        // 后台对象
private BackgroundWorker m_BackgroundWorker;
 
        public MainWindow()
        {
            InitializeComponent();
      // 实例化后台对象 
            m_BackgroundWorker = new BackgroundWorker(); 
            // 设置可以通告进度 
            m_BackgroundWorker.WorkerReportsProgress = true; 
             // 设置可以取消
            m_BackgroundWorker.WorkerSupportsCancellation = true;
             m_BackgroundWorker.DoWork += new DoWorkEventHandler(DoWork);
            m_BackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(UpdateProgress);
            m_BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(CompletedWork);
 
            m_BackgroundWorker.RunWorkerAsync(this);
        }
 
 
        void DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker bw = sender as BackgroundWorker;
            MainWindow win = e.Argument as MainWindow;
 
            int i = 0;
            while ( i <= 100 )
            {
                if (bw.CancellationPending)
                {
                    e.Cancel = true;
                    break;
                }
 
                bw.ReportProgress(i++);
                 //用Sleep()模拟一个长时间的处理
                 //用你的处理代替下面的Thread.Sleep(1000)
                Thread.Sleep(1000);
 
            }
        }
 
        void UpdateProgress(object sender, ProgressChangedEventArgs e)
        {
            int progress = e.ProgressPercentage;
 
            label1.Content = string.Format("{0}",progress);
        }
 
 
        void CompletedWork(object sender, RunWorkerCompletedEventArgs e)
        {
            if ( e.Error != null)
            {
                MessageBox.Show("Error");
            }
            else if (e.Cancelled)
            {
                MessageBox.Show("Canceled");
            }
            else
            {
                MessageBox.Show("Completed");
            }
        }
 
 
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            m_BackgroundWorker.CancelAsync();
        }
    }
追问
可以加点注释吗,因为我还不知道在哪里调用。点击“开始”,不仅进度条跟进,我那个长进程也跟着开始了,就在button1_Click()里面
追答

这样改:

public MainWindow()
{
    // 保留其他语句,
    // 注释掉或删掉最后一行语句
    //m_BackgroundWorker.RunWorkerAsync(this);
}
void DoWork(object sender, DoWorkEventArgs e)
{    
for( int i=0; i<100; i++)
     {
//你需要指向很久的操作语句放在这里
                // ……
               
               //修改进程条
                bw.ReportProgress(i);
}
}

private void button1_Click(object sender, EventArgs e)
{
            //启动长任务处理
            bkgWorker.RunWorkerAsync(this);
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式