Асинхронный HTTP-обработчик и использование HttpContext в фоновом потоке? - PullRequest
5 голосов
/ 10 февраля 2010

Я читал Пошаговое руководство. Создание асинхронного обработчика HTTP и заметил, что они пропускают HttpContext из потока обработчика и используют его в WaitCallback, который выполняется в фоновом потоке. Он делает звонки как _context.Response.Write(). Правильно ли я считаю, что это не нарушает тот факт, что HttpContext не является потокобезопасным, потому что поток обработчика не будет использовать его после начала асинхронной работы?

Кроме того, Использование HTTPContext между потоками содержит некоторую полезную информацию о HttpContext и потоках. Разве весь HttpContext не безопасен для потоков, или это просто элементы типа Response? Могут ли несколько фоновых потоков получить доступ к свойству Items, если только в режиме чтения?

1 Ответ

5 голосов
/ 24 февраля 2010

HttpContext и все его свойства не потокобезопасны, поэтому вы должны быть очень осторожны. Чтение данных одновременно из разных потоков не может причинить вреда, но вы должны быть уверены, что никаких операций записи не происходит. Тем не менее, даже если вы уверены, что свойство Items не изменилось, я бы предпочел сделать копию и передать ее фоновым потокам. Это четко сообщает о намерениях и избавляет вас от дискуссий во время проверки кода или от людей, переоценивающих, действительно ли этот код является поточно-ориентированным.

Теперь об использовании HttpContext в асинхронных запросах; Доступ к HttpContext из разных потоков был бы опасен, но в этом случае ASP.NET контролирует потоки и гарантирует, что только один поток обрабатывает запрос. Было бы иначе, если бы вы, например, раскручивали новый поток вручную (используя пул потоков или new Thread()) and supplying HttpContext для этого потока, продолжая выполнение.

...