我想显示在外部库中执行的计算进度。
例如,如果我有一些计算方法,并且我想将它用于我的 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/