У меня есть приложение Winform, которое выполняет несколько запросов в Excel-Datatables с oleDB. Пока это работает, но теперь я хочу добавить индикатор выполнения, который информирует пользователя о том, что приложение не зависает, а загружает необходимую информацию на основе ввода пользователя.
Использование Backgroundworker и новой задачи похоже на то, что индикатор выполнения и весь пользовательский интерфейс замирают.
private void updateButton_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
progressBar1.Style = ProgressBarStyle.Marquee;
Task t1 = Task.Factory.StartNew(() => QueryToExcel());
Task.WaitAll(t1);
progressBar1.Visible = false;
}
private void QueryToExcel()
{
//doing some data manipulation with LINQ, oleDB etc.
//and finally stored in datatable FinalTable
datagridview1.datasource = FinalTable;
datagridview1.Update();
}
EDIT:
Я полагаю, что проблема в том, что я устанавливаю datagridview.datasource = Datatable во время работы индикатора выполнения, поэтому все не отвечает. Итак, я хочу, чтобы Backgroundworker запустил манипулирование данными и поместил окончательный источник данных в качестве источника данных, в то время как он выполняется, индикатор выполнения должен просто продолжить этот этап. Если фоновый рабочий закончил, то индикатор выполнения должен просто исчезнуть ...
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
QueryToExcel();
}
private void updateButton_Click(object sender, EventArgs e)
{
progressBar1.Visible = true;
StartBackgroundWork();
}
private void StartBackgroundWork()
{
if (Application.RenderWithVisualStyles)
progressBar1.Style = ProgressBarStyle.Marquee;
else
{
progressBar1.Style = ProgressBarStyle.Continuous;
progressBar1.Maximum = 100;
progressBar1.Value = 0;
}
backgroundWorker1.RunWorkerAsync();
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressBar1.Value = 0;
dataGridView1.Update();
progressBar1.Visible = false;
}