Я работаю над веб-приложением asp.net mvc 5, развернутым внутри IIS-8, и у меня есть метод внутри моего приложения для выполнения длительной задачи, которая в основном сканирует нашу сеть на наличие серверов и виртуальных машин и обновляет нашу базу данных с результатами сканирования . выполнение метода может длиться от 30 до 40 минут в производственной среде. и я использую инструмент расписания под названием Hangfire, который будет вызывать этот метод 2 раза в день.
вот определение задания в файле startup.cs, которое вызовет метод в 8:01 am
& _2 _: -
public void Configuration(IAppBuilder app)
{
var options = new SqlServerStorageOptions
{
PrepareSchemaIfNecessary = false
};
GlobalConfiguration.Configuration.UseSqlServerStorage("scanservice",options);
RecurringJob.AddOrUpdate(() => ss.Scan(), "01 8,20 ***");
}
и вот метод, который вызывается дважды в день инструментом расписания: -
public void Scan()
{
Service ss = new Service();
ss.NetworkScan().Wait();
}
Наконец, метод, который выполняет настоящее сканирование, (я предоставляю только высокоуровневое описание того, что будет делать метод): -
public async Task<ScanResult> NetworkScan()
{
// retrieve the server info from the DB
// loop over all servers & then execute some power shell commands to scan the network & retrieve the info for each server one by one...
// after the shell command completed for each server, i will update the related server info inside the DB
в настоящее время я провел несколько тестов в нашей тестовой среде, и все работало хорошо, где сканирование заняло около 25 секунд, чтобы сканировать 2 тестовых сервера. но теперь мы планируем перенести приложение в производство, и у нас есть около 120 ++ серверов для сканирования . поэтому я оцениваю, что выполнение метода в производственной среде займет около 30-40 минут. Итак, мой вопрос в том, как я могу убедиться, что это выполнение никогда не истечет, а метод ScanNetwork () завершится до конца?
SqlServerOptions.InvisibilityTimeout
(по умолчанию до 30 минут) или просто обновите до Hangfire 1.5.0 (я удалил этот тайм-аут), чтобы другие работники не получали то же фоновое задание после тайм-аута. - person odinserj   schedule 03.10.2015IJobCancellationToken
(или простоCancellationToken
и его методThrowIfCancellationRequested
, если вы обновляетесь до 1.5.0) и передать его вашемуNetworkScan
методу, чтобы иметь возможность отменить сканирование при завершении работы приложения и предотвратить тайм-ауты завершения работы. - person odinserj   schedule 03.10.2015web request timed out
. Итак, в этих случаях вы начинаете обрабатывать длительное задание в фоновом потоке, а затем отправляете ответ обратно. Это приведет к тому, что ответ будет отправлен клиенту во время процесса LRJ. - person T.S.   schedule 06.10.2015