Я сталкивался с этим раньше.Вот как я это сделал.Это взято прямо из проекта, в котором я это делал. Вы должны быть в состоянии получить представление о том, как настроить потоки, чтобы сделать эту работу.Я не включал методы, которые на самом деле пишут CSV-файл, я предполагаю, что ваша основная проблема связана с потоками.И, как сказал Давиде Пирас, вероятно, не очень хорошая идея записывать данные непосредственно из элемента управления.
Событие BackGroundWorker's:
#region TableWorker Events
void TableWorker_DoWork(object sender, DoWorkEventArgs e)
{
bool done = false;
GetSwitch();
ProgressLabel.Visible = true;
while (!done)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(100);
TableWorker.ReportProgress(i);
}
done = Export.ExportDataTable(SaveFile, DataTable);
}
}
void TableWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
Progress.Style = ProgressBarStyle.Blocks;
Progress.Value = e.ProgressPercentage;
ProgressLabel.Text = "Writing File: " + e.ProgressPercentage.ToString() + "% Complete";
}
void TableWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Progress.Value = 100;
ProgressLabel.Visible = false;
Progress.Visible = false;
//MessageBox.Show("Export Completed!");
TableWorker.Dispose();
ExportButton.Enabled = true;
this.Close();
}
#endregion
Событие, запускающее BackgroundWorker.
private void EntireTableButton_Click(object sender, EventArgs e)
{
dialogResult = Export.SetSaveDialog(SaveFile, ".csv", "csv file (*.csv)|*.csv");
if (dialogResult == DialogResult.OK)
{
TableWorker.RunWorkerAsync();
this.Hide();
ProgressLabel.Visible = true;
ProgressLabel.Text = "Retrieving Data...";
Progress.Style = ProgressBarStyle.Marquee;
Progress.Visible = true;
ExportButton.Enabled = false;
while (TableWorker.IsBusy)
{
Application.DoEvents();
}
Progress.Visible = false;
}
}
Метод ReportProgress фонового работника позволит вам передавать прогресс в событие ProgressChanged.Сделав это, вы можете обновить индикатор выполнения в другой форме.