relief |
... Если, да, то как как, к примеру происходит работа с сессией? ... |
Так же, как и везде: асинхронный обработчик
void EndAsyncOperation(IAsyncResult ar) - это собственный метод класса
MyAsyncPage : System.Web.UI.Page, который имеет от базового класса свойство
Session доступное из любого потока.
relief |
... Ведь контекст привязывается к потоку. ... |
С чего бы, вдруг?
Контекст (если вы про экземпляр
HttpContext) всегда "живет" в потоке, который обрабатывает "жизненный цикл страницы" (pipe-line), именно оттуда он в качестве аргументов попадает в асинхронные обработчики
IHttpAsyncHandler/IHttpModule, а оттуда уже может попасть "внутрь" потоковых методов (тоже в качестве аргумента).
(в любом другом потоке, кроме обрабатывающего pipe-line,
HttpContext.Current == null, проверено опытом, хотя
Page.Context может быть доступен из любого потока, но к
IHttpAsyncHandler/IHttpModule это не относится).
relief |
... И как собственно происходит "подсовывание" второго потока? |
Да так и происходит: поток, обрабатывающий pipe-line, цепляет callback-и при вызове
AddOnPreRenderCompleteAsync или
AddOnPreRequestHandlerExecuteAsync, а
ThreadPool - сам разбирается в каком потоке потом эти callback-и "дергать"...