Вы не должны добавлять строку в другой поток. Поэтому вам нужно использовать событие ProgressChanged для диалога с другим потоком:
bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
bgw.WorkerReportsProgress = true;
Затем, когда это событие сработает, добавьте строку:
void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Tuple<int, DateTime, decimal> rowToAdd = e.UserState as Tuple<int, DateTime, decimal>;
listBox1.Items.Add(rowToAdd.Item1, rowToAdd.Item2, rowToAdd.Item3);
}
И в dowork, когда вы хотите добавить строку:
void bgw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker _bgw = sender as BackgroundWorker;
_bgw.ReportProgress(0, new Tuple<int, DateTime, decimal>(ID++, DateTime.Now, d));
}
Вы можете прочитать о кортежах здесь: Кортеж , но если ваша версия фреймворка слишком мала, вместо этого создайте пользовательский объект для хранения информации.
Остальные 2 вопроса, я бы ответил методом проб и ошибок;)