我有一个ASP.NET站点,我一直在做一些重构代码的工作,尝试通过创建BackgroundWorker并发送工作来从实际的http请求中删除一些长时间运行的进程(大约一小时)要处理。这在剪切测试中运行良好但是当我将逻辑应用于实际代码时,我发现从后台工作器中运行的代码访问Session变量时出现问题。似乎传递的HttpContext对象有一个空会话,如果我要求HttpContext.Current我得到null。
我假设这是因为它们位于不同的线程中,并且会话和HttpContext.Current都依赖于在同一个线程中。有什么方法可以让我从后台工作者访问Session,或者我一直在寻找会话中需要的所有变量并将它们置于可用的数据结构中,然后将它们放回会话中(如果合适的话)?如果我需要这样做,这显然会使重构变得复杂,所以我宁愿不这样做。
感谢您的任何想法。除了BackgroundWorker流程(在另一个问题中向我建议)之外,我对其他如何做到这一点的建议持开放态度。
答案 0 :(得分:1)
我不确定您的所有要求,但如果您不是在寻找与单个用户请求相关联的漫长过程,那么您可以使用应用程序缓存而不是会话。
如果是这样,我会尝试将您对Session的使用换成:
HttpRuntime.Cache.Set("CacheKeyName");
HttpRuntime.Cache.Get("CacheKeyName");
答案 1 :(得分:1)
Here是一个MSDN链接,对此有所了解。 该文本特别是:
如果异步操作方法调用通过使用BeginMethod / EndMethod模式公开方法的服务,则回调方法(即作为Begin方法的异步回调参数传递的方法)可能在一个线程上执行不受ASP.NET的控制。在这种情况下, HttpContext.Current将为null ,并且应用程序在访问AsyncManager类的成员(如Parameters)时可能会遇到竞争条件。为了确保您可以访问HttpContext.Current实例并避免竞争条件,可以通过从回调方法调用Sync()来恢复HttpContext.Current。