Когда вы говорите «до истечения времени ожидания», вы имеете в виду «продолжать обработку в течение часа, а затем остановить»? Если это так, я, вероятно, просто сделаю это очень явно: сначала отработайте, когда вы хотите закончить, затем в цикле обработки проверьте, достиг ли вы того времени или нет. Это невероятно просто, легко тестировать и т. Д. С точки зрения тестируемости вам могут понадобиться фальшивые часы, которые позволят вам программно установить время.
РЕДАКТИРОВАТЬ: Вот некоторые псевдокод, чтобы попытаться уточнить:
List<DataSource> dataSources = ConnectToDataSources();
TimeSpan timeout = GetTimeoutFromConfiguration(); // Or have it passed in!
DateTime endTime = DateTime.UtcNow + timeout;
bool finished = false;
while (DateTime.UtcNow < endTime && !finished)
{
// This method should do a small amount of work and then return
// whether or not it's finished everything
finished = ProcessDataSources(dataSources);
}
// Done - return up the stack and the console app will close.
Это просто использование встроенных часов, а не интерфейса часов, который можно смоделировать и т. Д. - но это, вероятно, делает общее подходящее проще для понимания.