c# - 如何使用WinForms进度条?

标签 c# winforms progress-bar

我想显示在外部库中执行的计算进度。

例如,如果我有一些计算方法,并且我想将它用于我的 Form 类中的 100000 个值,我可以这样写:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }            

    private void Caluculate(int i)
    {
        double pow = Math.Pow(i, i);
    }

    private void button1_Click(object sender, EventArgs e)
    {
        progressBar1.Maximum = 100000;
        progressBar1.Step = 1;

        for(int j = 0; j < 100000; j++)
        {
            Caluculate(j);
            progressBar1.PerformStep();
        }
    }
}

我应该在每次计算后执行步骤。但是如果我用外部方法执行所有 100000 次计算怎么办?如果我不想让这个方法依赖于进度条,我应该什么时候“执行步骤”?例如,我可以写

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void CaluculateAll(System.Windows.Forms.ProgressBar progressBar)
    {
        progressBar.Maximum = 100000;
        progressBar.Step = 1;

        for(int j = 0; j < 100000; j++)
        {
            double pow = Math.Pow(j, j); //Calculation
            progressBar.PerformStep();
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        CaluculateAll(progressBar1);
    }
}

但我不想那样做。

最佳答案

我建议你看看BackgroundWorker .如果您的 WinForm 中有一个如此大的循环,它将被阻止并且您的应用程序看起来就像挂起一样。

查看 BackgroundWorker.ReportProgress() 以了解如何将进度报告回 UI 线程。

例如:

private void Calculate(int i)
{
    double pow = Math.Pow(i, i);
}

private void button1_Click(object sender, EventArgs e)
{
    progressBar1.Maximum = 100;
    progressBar1.Step = 1;
    progressBar1.Value = 0;
    backgroundWorker.RunWorkerAsync();
}

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var backgroundWorker = sender as BackgroundWorker;
    for (int j = 0; j < 100000; j++)
    {
        Calculate(j);
        backgroundWorker.ReportProgress((j * 100) / 100000);
    }
}

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // TODO: do something with final calculation.
}

关于c# - 如何使用WinForms进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126889/

相关文章:

php - 简单的jQuery进度条百分比

c# - 如何使用反射从多级继承类中获取 protected friend 属性?

c# - Azure Web App - 如何使用 Fluent API 更新 MinTlsVersion

c# - 无法使用 mailto uri 创建具有多个收件人的新邮件

c# - 当用户在 RichTextBox 中键入时更改字体颜色

r - map 函数 R 中的进度条 - 网页抓取

android - Android 中的无边框进度条

c# - Blazor 测试 InputDate 与 bUnit 的绑定(bind)

c# - 使用 DataGridView、DataTable 和 DataAdapter 的 CRUD 操作 - 无法向 DataGridView 添加新行

c# - 如何使用c# AnimateWindow函数的滑动效果来显示和隐藏窗体?