#ajax #multithreading #asp.net-mvc-3
#ajax #многопоточность #asp.net-mvc-3
Вопрос:
Хорошо, я прочитал ряд других сообщений о StackOverflow, касающихся многопоточности, но я не вижу ни одного, который отвечал бы на мой конкретный вопрос.
У меня есть приложение MVC 3, которое обрабатывает около 5000 записей из XML-документа в базу данных. Я хочу, чтобы представление содержало консоль AJAX, которая отслеживает ход транзакции (сколько успешных записей, сколько сбоев, потенциальные повторяющиеся флаги и т. Д.). Могу ли я иметь один экземпляр контроллера, выполняющий процесс, который заполняет переменную уровня сеанса по мере выполнения, и иметь другой экземпляр, который просто вызывается консолью AJAX с интервалом в 1 секунду для получения значений переменных сеанса?
Есть ли лучший способ? Я вижу, что многие люди ссылаются на многопоточность, но я не вижу никаких решений, которые я мог бы применить напрямую. Предложения?
Комментарии:
1. Возможно, статический
class.variable
был бы правильным решением.
Ответ №1:
Ваше предложение выполнимо, но потребует некоторых размышлений. Если у вас поступает несколько запросов AJAX, то IIS будет обрабатывать эти запросы в нескольких потоках, так что вы переходите к многопоточности. Это означает, что вы должны сделать доступ к состоянию сеанса потокобезопасным. Итак, вам потребуется что-то вроде этого:
// put an instance of this class in the user's Session
class Progress
{
public object Locker { get; private set; }
public Progress()
{
Locker = new Object();
}
public int SuccessCount { get; set; }
public int FailureCount { get; set; }
public int DuplicateCount { get; set; }
}
// update the counts in the processing logic inside a lock
Progress progress = Session[ ... ];
lock( progress.Locker )
{
progress.SuccessCount = ...
progress.FailureCount = ...
progress.DuplicateCount = ...
}
// read the counts in the progress handler also inside a lock on the same object
Progress progress = Session[ ... ];
lock( progress.Locker )
{
retval.SuccessCount = progress.SuccessCount;
retval.FailureCount = progress.FailureCount;
retval.DuplicateCount = progress.DuplicateCount;
}
return retval;
Вам также придется обрабатывать случай, когда поток обработки завершается и удаляет объект сеанса одновременно с обработкой запроса на выполнение. Кроме того, вам может потребоваться обрабатывать несколько потоков обработки (и, следовательно Progress
, объектов) за один сеанс.
Есть над чем подумать, но это выполнимо.
Комментарии:
1. Как вы думаете, использование статического класса было бы лучше? Я попробовал это в субботу вечером, и, похоже, это сработало довольно хорошо, но я не уверен, что это исключение. Я собираюсь исследовать и протестировать ваш подход. Спасибо.