Hui*_*Hui 4 c# multithreading backgroundworker winforms
我正在学习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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我很确定这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;
}
Run Code Online (Sandbox Code Playgroud)
除非您当然只是尝试动画进度条而不实际报告任何进度,在这种情况下,您应该只使用Marquee将自动滚动进度条而不执行任何操作的类型.或者只使用后台线程Thread.Sleep().
| 归档时间: |
|
| 查看次数: |
10805 次 |
| 最近记录: |