在 C# 中实现进度条的正确方法

2024-03-03

我正在学习 winforms,我给自己设定了一个简单的目标,即制作一个从空到满的进度条。这是我的畸形尝试:

public partial class Form1 : Form
{
    static BackgroundWorker bw = new BackgroundWorker();

    public Form1()
    {
        InitializeComponent();
        bw.DoWork += bw_DoWork;
        bw.RunWorkerAsync();
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i=0; i<100; ++i)
        {
            progressBar1.PerformStep();
            Thread.Sleep(10);
        }
    }
}

我很确定Thread.Sleep()是应该受到谴责的。这里我该如何避免呢?


你已经做得几乎正确了。这BackgroundWorker已经有一个内置的进度报告机制。

public Form1()
{
    bw1.WorkerReportsProgress = true;
    bw1.ProgressChanged += bw1_ProgressChanged;
    bw1.DoWork += bw1_DoWork;

    bw1.RunWorkerAsync();
}

private void bw1_DoWork(object sender, DoWorkEventArgs e)
{
    var worker = sender as BackgroundWorker;

    while (workNotDone)
    {
        //Do whatever work
        worker.ReportProgress(CalculateProgressDonePercentage());
    }
}

private void bw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //This is called on GUI/main thread, so you can access the controls properly
    progressBar.Value = e.ProgressPercentage;
}

当然,除非您只是尝试为进度条设置动画而不实际报告任何进度,在这种情况下您可能应该只使用Marquee类型将自动滚动进度条而不执行任何操作。或者只是使用后台线程Thread.Sleep().

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# 中实现进度条的正确方法 的相关文章

随机推荐