Процесс C #-поток мониторинга для подачи в консоль AJAX

#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. Как вы думаете, использование статического класса было бы лучше? Я попробовал это в субботу вечером, и, похоже, это сработало довольно хорошо, но я не уверен, что это исключение. Я собираюсь исследовать и протестировать ваш подход. Спасибо.