Вы можете использовать компонент BackgroundWorker для ожидания завершения асинхронной задачи. Это просто.
Сначала перетащите BackgroundWorker из панели инструментов в форму.
Второе - когда вы начинаете обработку (например, при нажатии кнопки), добавьте следующий код:
private void button_Click(object sender, EventArgs e)
{
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
backgroundWorker1.RunWorkerAsync();
}
Далее - добавить в обработчик событий DoWork код, который начинает обработку и опрос базы данных:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// schedule some work
// poll database
}
И последнее - добавить обработчик RunWorkerCompleted, который будет запускаться сразу после завершения DoWork (т.е. все задачи обновляли свое состояние в базе данных):
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// generate report
}
Вот и все. Кстати, BackgroundWorker может сообщать о прогрессе во время опроса базы данных. Небольшой поиск поможет вам, как это сделать:)