在异步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)。但是,我想详细了解这一点。
答案 0 :(得分:0)
无法弄清楚细节...... 但是找到了一种解决方法:在大多数IAsyncResult实现中,一旦操作完成,就会直接调用回调。我们替换了它,现在将回调排队到ThreadPool中。因此,回调在ThreadPool中执行,并且可以注册持续的依赖项。