【发布时间】:2014-11-28 13:42:32
【问题描述】:
我有一个 BackgroundWorker:
BackgroundWorker worker;
private void Form1_Load(object sender, EventArgs e)
{
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged +=
new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
}
DoWork 事件
void worker_DoWork(object sender, DoWorkEventArgs e)
{
int percentFinished = (int)e.Argument;
while (!worker.CancellationPending && percentFinished < 100)
{
percentFinished++;
worker.ReportProgress(percentFinished);
//here I start my operation
//operation....
//operation end
}
e.Result = percentFinished;
}
进度改变
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
完成
void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("Asynchroner Thread kam bis zum Wert:
"+e.Result.ToString());
btnStartEnd.Text = "Starten";
}
最后是我的按钮:
private void btnStartEnd_Click(object sender, EventArgs e)
{
if (worker.IsBusy)
{
worker.CancelAsync();
btnStartEnd.Text = "Starten";
}
else
{
if (progressBar1.Value == progressBar1.Maximum)
{
progressBar1.Value = progressBar1.Minimum;
}
worker.RunWorkerAsync(progressBar1.Value);
btnStartEnd.Text = "Stoppen";
}
}
此代码有效,但我的操作会出现循环,直到百分比为 100,因此操作开始 100 次,因此需要 100 倍的时间。
目标应该是操作只开始一次,百分比从 1 到 100 计数。
也许我理解错了,但是工人怎么知道操作完成了多远?该值应发送到进度条以进行可视化。
【问题讨论】:
-
不幸的是,回答您的问题的唯一方法是准确了解您的操作中发生了什么(在问题中仅由 cmets 表示)。当然,您不想仅仅为了进步而循环 100 次。但是您需要操作本身具有可以报告进度的有意义的间隔。您的问题中没有任何内容表明它是如何工作的,因为它根本不包含有关操作本身的任何细节。
标签: c# backgroundworker