I read from < Essential ASP.NET with Examples in C# > the following statement:

另一个有用的特性是静态电流特性

我想知道大胆的部分的根本原因,一件事导致另一件事,这是我的 idea :

我们知道一个进程可以有多个线程.每个线程都有各自的堆栈.这些线程还可以访问共享内存区域堆.

据我所知,堆栈是存储该线程的所有上下文的地方.为了让线程访问堆中的某些内容,它必须使用指针,指针存储在堆栈中.

因此,当我们进行一些跨线程调用时,我们必须确保所有必要的上下文信息都从调用方线程的堆栈传递到被调用方线程的堆栈.

但是我不太确定我是否弄错了.

如有任何意见,我们将深表感谢.

谢谢

添加

这里的堆栈限制为user stack.

推荐答案

有四个因素共同作用,导致您所询问的行为:

  1. HttpContext是一个实例对象,其引用可以在HttpContext.Current中找到
  2. 线程也是一个实例对象,其引用可以在Thread.CurrentThread中找到
  3. Thread.CurrentThread是静态的,但在每个线程中引用不同的Thread对象
  4. HttpContext.Current实际上是Thread.CurrentThread.ExecutionContext.IllogicalCallContext.HostContext

从以上假设中我们可以得出以下结论:

  1. 因为HttpContext是一个实例对象,而不是静电,所以我们需要它的引用来访问它
  2. 因为HttpContext.Current实际上指向Thread.CurrentThread上的属性,所以将Thread.CurrentThread更改为不同的对象可能会更改HttpContext.Current
  3. 因为Thread.CurrentThread'在切换线程时会发生变化,所以HttpContext.Current在切换线程时也会发生变化(在本例中,HttpContext.Current变为null).

综上所述,是什么原因导致HttpContext.Current在新的线程中不起作用?切换线程时发生的Thread.CurrentThread引用更改会更改HttpContext.Current引用,这会阻止我们访问所需的HttpContext实例.

重申一下,这里唯一的神奇之处就是Thread.CurrentThread在每个线程中引用不同的对象.HttpContext的工作方式与任何其他实例对象一样.因为同一AppDomain中的线程可以引用相同的对象,所以我们所要做的就是将HttpContext的引用传递给我们的新线程.没有要加载的上下文信息或类似的内容.(将HttpContext传递给其他线程有一些相当严重的潜在trap ,但没有什么可以阻止您这样做).

在研究过程中,我发现了一些最后的旁注:

  1. 在某些情况下,线程的ExecutionContext从一个线程"流动"(复制)到另一个线程.那么,为什么HttpContext没有"流"到我们的新线程?因为HttpContext没有实现iLogicThreadAffinative接口.存储在ExecutionContext中的类只有在实现iLogicThreadAffinative时才会流动.

  2. ASP.NET将HttpContext从一个线程移动到另一个线程(线程敏捷性),如果它没有流动?我不完全确定,但看起来它可能在HttpApplication.OnThreadEnter()分钟内通过.

Asp.net相关问答推荐

检测 ASP.NET 中的内存泄漏

此版本的 SQL Server 不支持用户实例登录标志.连接将关闭

ASP.NET Web 应用程序 (.NET Framework) 与 ASP.NET Core Web 应用程序 (.NET Framework) 之间的差异

ASP.NET GridView 第二个标题行跨越主标题行

如何使用 SmtpClient.SendAsync 发送带有附件的邮箱?

如何将 Castle Windsor 与 ASP.Net Web 表单一起使用?

Response.Redirect 使用 ~ 路径

在属性中实现逻辑是一种好习惯吗

返回值使用 String result=Command.ExecuteScalar() 结果返回 null 时发生错误

什么相当于 ASP.NET 中的 cron 作业(job)?

相当于服务器端的 ASP.NET 包括

在使用网络服务器加载它们之前,如何编译 Asp.Net Aspx 页面?

最佳服务器端 .NET PDF 编辑库

在生产中使用 LocalDb 是否正常?

在 ASP.NET 中实现 404 的最佳方法

如何在 ASP.Net 网络表单中使用标签?

如何从后面的 ASP.NET 代码访问 HTML 表单输入

由 UpdatePanel 内 GridView 内的 LinkBut​​ton 触发的完整回发

HttpContext.Current.Request.Url.Host 它返回什么?

使用 ConfigurationManager.RefreshSection 重新加载配置而不重新启动应用程序