[英]Using BackgroundWorker with ProgressBar in WPF
嗨我有一个应用程序,其中一个作业将转换Excel并将所有记录传递给数据库。
所以这需要一点时间,因为它将超过7000行,我将获得并插入到数据库中。
因为这项工作需要一点时间,超过3分钟,我想使用ProgressBar来报告这项工作的进展情况。
因此,如果我正在创建我创建的这个Job in Class,那么我如何使用backgroundWorker向我的案例中的progessBar报告进度?
我的目标是准确地了解进展的百分比,以及如何使用所有这些东西来报告进度。 我从未与backgroundWorkers合作过。
我想,这只是一个提示,可能是好的或不是,我首先得到excel中的行数,将该数字作为ProgressBar中的一些Maxvalue,然后对于每一行或在一个间隔中我报告进度。
这个有可能? 我该怎么做?
我喜欢使用ProgressBars的绑定(以及可能的其他所有内容),因为这样你就不必担心调度到UI线程了 。
基本上,您创建了一个实现INotifyPropertyChanged的类,其中包含可以将ProgressBar绑定到的progress属性。 例如
public class Task : INotifyPropertyChanged
{
private int _progress = 0;
public int Progress
{
get { return _progress; }
private set
{
if (_progress != value)
{
_progress = value;
OnPropertyChanged("Progress");
}
}
}
public Task(ref ProgressChangedEventHandler progressChangedEvent)
{
progressChangedEvent += (s, e) => Progress = e.ProgressPercentage;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
此类在构造函数中使用一个事件,如果引发该事件将更新任务的进度,但您可以以任何方式处理Progress更改,例如方法或将Progress属性设置为public
以便您可以随意更改它。
用法示例:
<ProgressBar Minimum="0" Maximum="100" Height="20"
Value="{Binding UpdateTask.Progress, Mode=OneWay}"/>
// The event that should be raised when a progress occurs.
private event ProgressChangedEventHandler UpdateProgressChanged;
// The task the ProgressBar binds to.
private readonly Task _updateTask;
public Task UpdateTask
{
get { return _updateTask; }
}
public MainWindow()
{
// Instatiate task, hooking it up to the update event.
_updateTask = new Task(ref UpdateProgressChanged);
}
private void OnUpdateProgressChanged(int progressPercentage)
{
if (UpdateProgressChanged != null)
{
UpdateProgressChanged(this, new ProgressChangedEventArgs(progressPercentage, null));
}
}
// Simple progress simulation
private void Button1_Click(object sender, RoutedEventArgs e)
{
int progress = 0;
DispatcherTimer timer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(0.5) };
timer.Tick += (sSub,eSub) =>
{
progress++;
// Raise progress changed event which in turn will change
// the progress of the task which in turn will cause
// the binding to update which in turn causes the value
// of the ProgressBar to change.
OnUpdateProgressChanged(progress);
if (progress == 100)
{
timer.Stop();
}
};
timer.Start();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.