Асинхронный обработчик HTTP и использование HttpContext в фоновом потоке?

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

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


person Kevin Hakanson    schedule 10.02.2010    source источник


Ответы (1)


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

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

person Steven    schedule 24.02.2010