22

我正在使用以下方法在单独的线程上进行一些异步工作:

ThreadPool.QueueUserWorkItem()

在这个单独的线程中,我需要调用HttpContext.Current以便可以访问:

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

但是,HttpContext.Current当我创建这个单独的线程时为空。

问题

如何创建一个HttpContext.Current不为空的新线程?还是有其他方法可以访问 Cache、Server 和 Request 对象?

4

6 回答 6

37

即使没有 HttpContext,您也可以使用HttpRuntime.Cache访问 ASP.NET 缓存,但遗憾的是您无法访问 Server 或 Request。

如果您考虑一下,这是有道理的 - 您没有提供任何页面,因此您没有请求。

于 2009-02-09T18:37:37.470 回答
14

我会尽量不保留对依赖于 ASP.NET 堆栈(如 HttpContext)的对象的引用。如果您需要在不同的线程中做一些工作,那是因为您不想在 ASP.NET 中等待任务完成。也许请求/上下文/会话被终止,而你的线程没有。

您应该传递一个包含线程所需数据的对象。

于 2009-02-09T18:50:46.237 回答
3

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

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2- 在 Web 服务文件中的 NameSpace 之后添加底部代码:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

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

参考

于 2012-06-11T08:26:49.137 回答
1

对于 HttpContext.Server 服务,您可以使用 HttpServerUtility 类。对于缓存,您可以使用 HttpRuntime.Cache,正如上面所说。对于请求对象,您可以在创建请求时将数据从请求传递到线程。诸如 Request.QueryString 或 Request.Form... 之类的东西。

于 2009-02-11T00:11:03.033 回答
1

这里有一个线程池实现,提供调用线程的 HTTP 上下文的传播。我还没用过,但我打算用。

于 2010-04-21T13:33:54.537 回答
0

如果单独的线程试图访问这些对象,那么是的,它们将为空。这些对象的范围是线程级别的。如果您想在新线程中使用它们,您必须将它们传递到您需要它们的方法/类中。

通常 ASP.Net 不允许您生成新线程...这是有关该主题的帖子

这是一篇来自 MSDN 的关于 ASP.NET中的线程的很好的文章。

于 2009-02-09T18:41:42.000 回答