BackGroundWorker.RunWorkerCompleted вызывается после завершения вашего события DoWork.Поэтому, если вы убедитесь, что событие DoWork завершено, ваше событие RunWorkerCompleted должно вызываться фоновым рабочим.
Другое решение - создать таймер вне фонового рабочего и управлять экземпляром фонового рабочего из таймера.В событии таймера проверьте, установлено ли для свойства IsBusy значение false, и запустите фоновый рабочий или пропустите, если IsBusy имеет значение true.
Пример:
_worker.DoWork += (sender, e) =>
{
BackgroundWorker worker = sender as BackgroundWorker;
// Do your database stuff
e.Result = databaseResult;
}
_timer.Elapsed += (source, e) =>
{
if(!_worker.IsBusy)
{
_worker.RunWorkerAsync();
}
}