我有一个C#ASP.NET应用程序,它启动了大约25个不同的线程,在一个名为SiteCrawler.cs的类中运行一些方法.
在HttpContext.Current.Session我要保存用户所做的搜索结果,当所有线程都完成运行它呈现给用户.我的问题是该HttpContext.Current对象在生成的线程中为null,因为它不存在.
由于应用程序是多线程的限制,我还有什么其他选项来保存用户/会话特定数据而不使用会话?
我试图搜索Stackoverflow的每一寸都找到一个解决方案,但没有任何运气....
我从<Essential ASP.NET with C#中的示例>中读取以下语句:
另一个有用的属性是HttpContext类的静态Current属性.此属性始终指向要提供服务的请求的HttpContext类的当前实例.如果您正在编写将从页面或其他管道类中使用的辅助类,并且可能因任何原因需要访问上下文,这可能很方便.通过使用静态Current属性来检索上下文,可以避免将对它的引用传递给辅助类.例如,清单4-1中显示的类使用上下文的Current属性来访问QueryString并将内容打印到当前响应缓冲区.请注意,要正确初始化此静态属性,调用方必须在原始请求线程上执行,因此如果您在请求期间生成了其他线程来执行工作,则必须注意自己提供对上下文类的访问.
我想知道大胆部分的根本原因,有一件事导致另一件事,这是我的想法:
我们知道一个进程可以有多个线程.这些线程中的每一个分别具有它们自己的堆栈.这些线程还可以访问共享内存区域堆.
然后,根据我的理解,堆栈是存储该线程的所有上下文的地方.对于访问堆中某些东西的线程,它必须使用指针,并且指针存储在其堆栈中.
因此,当我们进行一些跨线程调用时,我们必须确保所有必要的上下文信息都从调用者线程的堆栈传递到被调用者线程的堆栈.
但我不确定我是否犯了任何错误.
任何评论都将深表感谢.
谢谢.
这里堆栈仅限于用户堆栈.
我正在使用一个依赖于HttpContext.Current的库.该库是Facebook C#SDK,但我的问题也适用于其他场景.我想从并行线程中使用这个库.但是,HttpContext.Current在并行线程中不可用,所以我正在考虑将其缓存到局部变量,然后在并行线程中设置它,如下所示:
var httpContext = HttpContext.Current;
Parallel.ForEach(items, item => {
try {
HttpContext.Current = httpContext;
// Call a method that relies on HttpContext.Current
} finally {
HttpContext.Current = null;
}
});
Run Code Online (Sandbox Code Playgroud)
你预见到这有什么不对吗?这样做有什么影响吗?
c# asp.net multithreading task-parallel-library facebook-c#-sdk