C # поток мониторинга процесса для подачи на консоль AJAX - PullRequest
0 голосов
/ 09 октября 2011

Хорошо, я прочитал ряд других постов в StackOverflow, касающихся многопоточности, но я не вижу ни одного, который отвечает на мой конкретный вопрос.

У меня есть приложение MVC 3, которое обрабатывает около5000 записей из XML-документа в базу данных.Я хочу, чтобы представление содержало консоль AJAX, которая контролирует ход транзакции (сколько успешно пишет, сколько неудачно, потенциальные дублирующие флаги и т. Д.).Могу ли я иметь один экземпляр контроллера, выполняющий процесс, который заполняет переменную уровня сеанса по мере выполнения, и иметь другой экземпляр, который просто вызывается консолью AJAX с интервалами в 1 секунду для получения значений переменной сеанса?есть лучший способ?Многопоточность - это то, на что ссылаются многие люди, но я не вижу решений, которые можно было бы применить напрямую.Предложения?

1 Ответ

1 голос
/ 09 октября 2011

Ваше предложение выполнимо, но потребует некоторых размышлений.Если у вас есть несколько 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 объектов) за один сеанс.

Есть над чем подумать, но это выполнимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...