С помощью BackgroundWorker вы можете ReportProgress и передать процент завершения и объект. Вы можете создать класс, содержащий данные для передачи в пользовательский интерфейс, а затем передать его как объект.
Событие ProgressChanged может манипулировать объектами пользовательского интерфейса, поскольку оно будет выполняться в потоке пользовательского интерфейса.
Пример вашей проблемы
private void Form1_Load(object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
List<string> items = new List<string>();
items.Add("Starting");
System.Threading.Thread.Sleep(2500);
backgroundWorker1.ReportProgress(25, items.ToArray());
items.Add("Halfway there");
System.Threading.Thread.Sleep(2500);
backgroundWorker1.ReportProgress(50, items.ToArray());
items.Add("Almost there");
System.Threading.Thread.Sleep(2500);
backgroundWorker1.ReportProgress(75, items.ToArray());
items.Add("Done");
System.Threading.Thread.Sleep(2500);
backgroundWorker1.ReportProgress(100, items.ToArray());
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
listBox1.Items.Clear();
listBox1.Items.AddRange((string [])e.UserState);
this.Text = e.ProgressPercentage.ToString();
}
Второй аргумент в ReportProgress - это тип объекта. вы можете положить в нее все, что захотите, и привести его к нужному типу с другой стороны.