我使用做在一个单独的线程一些异步工作:

ThreadPool.QueueUserWorkItem()

和在该单独的线程,我需要调用HttpContext.Current这样我可以访问:

HttpContext.Current.Cache  
HttpContext.Current.Server  
HttpContext.Current.Request  

然而,当我创建这个单独的线程HttpContext.Current为空。

问题

如何创建一个新的线程,这样HttpContext.Current不为空?还是有另一种方法,我可以访问缓存,服务器,并请求对象?

有帮助吗?

解决方案

我想尝试不举行参照取决于像的HttpContext的ASP.NET栈上的对象。如果你需要做的在不同的线程一些工作,那是因为你不想在ASP.NET一个要等到你的任务就完成了。也许当你的线程不是请求/上下文/会话终止。

您应该通过与需要为您的线程数据的对象。

其他提示

您可以访问ASP.NET缓存中的 HttpRuntime.Cache ,即使你没有一个HttpContext的,可惜你不能访问服务器或请求。

如果你仔细想想,这是有意义的 - 你不投放任何网页,让你没有请求

在1-添加<system.serviceModel>底部代码在Web.config文件:

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2-名称空间后添加底代码在web服务文件:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

3-重建Web部件项目。 完成!

参考

有关HttpContext.Server服务,您可以使用HttpServerUtility类。 对于高速缓存可以使用HttpRuntime.Cache,因为上面已经说了。 对于请求对象,你可以从请求到线程创建时传递数据。事情是这样的Request.QueryString或的Request.Form ...或什么的。

有一个线程池实现此处提供调用线程的HTTP上下文的传播。我还没有使用它,但是我打算。

如果在单独的线程试图访问这些对象,则它们是将是无效的。这些对象在线程级作用域。如果你想在一个新的线程使用它们,你将不得不将它们传递到方法/类,你需要他们。

通常ASP.Net不会让你产生新的线程......这里是一个的帖子上的对象。

下面是一个很好的写入了上穿线/ A>

scroll top