Первое, о чем вам нужно беспокоиться, это тот факт (я предполагаю), что вы выполняете потенциально длительную операцию в коде ASP.NET.Это станет проблемой, когда вы будете использовать тайм-ауты IIS.(По умолчанию 90 секунд.) Предположим, вы обрабатываете десять URL-адресов, каждый из которых занимает 15 секунд, чтобы завершить reader.ReadToEnd()
- ваш код истечет время и будет убит после шестого URL-адреса.
думать «я могу просто увеличить время ожидания», но это не очень хороший ответ;вы все еще испытываете нехватку времени.
Способ решения подобных проблем состоит в том, чтобы переместить длительные операции в автономную службу Windows, а затем использовать WCF для обмена данными между кодом ASP.NET и службой.Служба может запускать пул потоков, который выполняет запросы для обработки группы URL-адресов.( Вот реализация , которая позволяет ставить рабочие элементы в очередь.)
Теперь со своей веб-страницы вы можете запрашивать обновления статуса с помощью запросов AJAX.Обработчик в вашем коде ASP.NET может использовать WCF для извлечения информации о состоянии из процесса Service.
Для этого можно назначить каждому представленному рабочему блоку уникальный идентификатор и вернуть этот идентификатор клиенту.,Затем клиент может опросить статус, отправив запрос AJAX о состоянии рабочего блока n
.В Службе сохраняйте List
рабочих единиц с их статусами (lock
в зависимости от ситуации, чтобы избежать проблем параллелизма).
public class WorkUnit {
public int ID { get; set; }
public List<string> URLs { get; set; }
public int Processed { get; set; }
}
private var workUnits = new List<WorkUnit>();
private void ExecuteWorkUnit(int id) {
var unit = GetWorkUnit(id);
foreach (var url in unit.URLs) {
string html = GetContent(url);
// do whatever else...
lock (workUnits) unit.Processed++;
}
}
public WorkUnit GetWorkUnit(int id) {
lock (workUnits) {
// Left as an exercise for the reader
}
}
Вы будетеМне нужно заполнить методы для добавления рабочего модуля, возврата статуса данного рабочего модуля и работы с пулом потоков.
Я использовал подобную архитектуру с большим успехом.