I've created a simple app that adds 10 times a string to a ListView every second and displays it. All this is done using a BackgroundWorker and a ProgressBar that shows the adding progress. My question is, since I've heard that pausing a thread is very dangerous and can lead to several problems, how can I replace the Thread.Sleep with let's say a DispatcherTimer? What if I would add 1000000 elements to this list and report the progress? Is it better to use Thread.Sleep(1) or something else in this case?
My code is the following:
private BackgroundWorker worker = new BackgroundWorker();
public MainWindow()
{
InitializeComponent();
}
private void btnAggiungi_Click(object sender, RoutedEventArgs e)
{
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerCompleted += worker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
String text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit.";
int min;
int max = 10;
for (min = 1; min <= max; min++)
{
int progressPercentage = Convert.ToInt32((double)min / max * 100);
worker.ReportProgress(progressPercentage, text);
Thread.Sleep(100);
}
}
private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pb.Value = e.ProgressPercentage;
lstLoremIpsum.Items.Add(e.UserState.ToString());
}
private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
lblCompleted.Content = "Done";
}
Screenshot: