ASP.NET CacheDependency超出ThreadPool

时间:2010-02-19 16:12:05

标签: asp.net caching multithreading dependencies threadpool

在异步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 syndrom)。但是,我想详细了解这一点。

1 个答案:

答案 0 :(得分:0)

无法弄清楚细节...... 但是找到了一种解决方法:在大多数IAsyncResult实现中,一旦操作完成,就会直接调用回调。我们替换了它,现在将回调排队到ThreadPool中。因此,回调在ThreadPool中执行,并且可以注册持续的依赖项。