我正在使用以下单独的线程进行异步工作:
ThreadPool.QueueUserWorkItem()
在这个单独的主题中,我需要调用HttpContext.Current
以便我可以访问:
HttpContext.Current.Cache
HttpContext.Current.Server
HttpContext.Current.Request
但是,当我创建这个单独的线程时,HttpContext.Current
为null。
如何创建新线程以使HttpContext.Current
不为空?或者是否有另一种方法可以访问Cache,Server和Request对象?
答案 0 :(得分:36)
即使您没有HttpContext,也可以使用 HttpRuntime.Cache 访问ASP.NET缓存,但遗憾的是您无法访问服务器或请求。
如果您考虑一下,这是有道理的 - 您没有提供任何页面,因此您没有请求。
答案 1 :(得分:14)
我尝试不要像HttpContext那样持有对依赖ASP.NET堆栈的对象的引用。如果你需要在不同的线程中做一些工作,那是因为你不想在ASP.NET中等待,直到你的任务完成。也许请求/上下文/会话在您的线程不是时终止。
您应该传递一个包含线程所需数据的对象。
答案 2 :(得分:3)
1-在Web.config文件的<system.serviceModel>
中添加底部代码:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
2-在Web服务文件中的NameSpace之后添加底部代码:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
3-重建Web部件项目。 完成!
答案 3 :(得分:1)
对于HttpContext.Server服务,您可以使用HttpServerUtility类。 对于Cache,您可以使用HttpRuntime.Cache,如上所述。 对于请求对象,您可以在创建时将数据从请求传递给线程。像Request.QueryString或Request.Form ......等等。
答案 4 :(得分:1)
有一个线程池实现here,它提供了调用线程的HTTP上下文的传播。我还没用过,但我打算。
答案 5 :(得分:0)
如果单独的线程试图访问这些对象,那么它们将为null。这些对象的作用域是线程级别的。如果要在新线程中使用它们,则必须将它们传递到您需要它们的方法/类中。
通常,ASP.Net不允许您生成新的线程......这里有一个post。
这是threading in ASP.NET from MSDN的一个很好的写作。