C# 在C中实现progressbar的正确方法#
我正在学习winforms,我为自己设定了一个简单的目标,即制作一个从空到满的progressbar。以下是我畸形的尝试:C# 在C中实现progressbar的正确方法#,c#,winforms,multithreading,backgroundworker,C#,Winforms,Multithreading,Backgroundworker,我正在学习winforms,我为自己设定了一个简单的目标,即制作一个从空到满的progressbar。以下是我畸形的尝试: public partial class Form1 : Form { static BackgroundWorker bw = new BackgroundWorker(); public Form1() { InitializeComponent(); bw.DoWork += bw_DoWork;
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);
}
}
}
公共部分类表单1:表单
{
静态BackgroundWorker bw=新的BackgroundWorker();
公共表格1()
{
初始化组件();
bw.DoWork+=bw_DoWork;
RunWorkerAsync();
}
void bw_DoWork(对象发送方,DoWorkEventArgs e)
{
对于后台线程中的(inti=0;i,调用thread.Sleep
如果这是一个占位符,您可以用实际工作安全地替换它
但是,您不能直接从后台线程操作ProgressBar(或任何其他控件)。
相反,您应该使用BackgroundWorker
的内置进度功能来控制进度条
如果你只是想制作一个毫无意义的进度,你应该使用WinForms定时器,而不是BackgroundWorker
,你已经做得差不多了。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;
}
当然,除非您只是尝试在不实际报告任何进度的情况下设置进度条的动画,在这种情况下,您可能应该只使用字幕
类型,该类型将自动滚动进度条,而不执行任何操作。或者只使用带有线程的后台线程。Sleep()
如果您只是想在执行耗时任务时测试更新UI,Thread.Sleep
是可以的。对于非普通程序,您总是可以在此处找到一些任务来代替
但是,您不应该直接在BackgroundWorker.DoWork
中更新进度条,因为Windows要求必须在UI线程而不是后台线程上调用更新UI。相反,请调用BackgroundWorker.ReportProgress
方法。始终在BackgroundWorker.ProgressChanged
事件中更新UI。
您可以在这里看到示例:Try.Or.Or。或者,如果您想做一些激动人心的事情,尝试运行一个算法并使用秒表对象来测量该算法中的一个步骤,那么您可以计算该步骤将执行多少次,这样您就可以得到总时间,并基于此使用您的数学技能来获得当前Sta的百分比葛,所以我想这会让你的老师满意的。