ASP.NET CacheDependency из ThreadPool - PullRequest
       12

ASP.NET CacheDependency из ThreadPool

0 голосов
/ 19 февраля 2010

В асинхронном http-обработчике мы добавляем элементы в кеш ASP.NET с зависимостями от некоторых файлов. Если асинхронный метод выполняется в потоке из ThreadPool, все в порядке:

AsyncResult result = new AsyncResult(context, cb, extraData);
ThreadPool.QueueUserWorkItem(new WaitCallBack(DoProcessRequest), result);

Но как только мы пытаемся выполнить поток из ThreadPool:

AsyncResult result = new AsyncResult(context, cb, extraData);
Runner runner = new Runner(result);
Thread thread = new Thread(new ThreadStart(runner.Run());

... где Runner.Run просто вызывает DoProcessRequest,

Зависимости срабатывают сразу после выхода из потока. То есть элементы немедленно удаляются из кэша, причина - в зависимостях.

Мы хотим использовать поток вне пула, потому что обработка может занять много времени.

Так что, очевидно, чего-то не хватает, когда мы создаем поток. Возможно, нам придется распространять контекст вызова, контекст http ...

Кто-нибудь уже сталкивался с этой проблемой?

Примечание: стандартные пользовательские пулы, вероятно, решают эту проблему. Написание собственного пула потоков - это, вероятно, плохая идея (подумайте о синдроме NIH). И все же я хотел бы разобраться в этом подробнее.

1 Ответ

0 голосов
/ 22 февраля 2010

Не удалось выяснить детали ... Однако нашел обходной путь: в большинстве реализаций IAsyncResult после завершения операции происходит прямой вызов обратного вызова.Мы заменили это, и теперь поместим обратный вызов в ThreadPool.Следовательно, обратный вызов выполняется в ThreadPool и может регистрировать зависимости, которые сохраняются.

...