- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
This comment通过 Stephen Cleary说的是:
AspNetSynchronizationContext
is the strangest implementation. It treatsPost
as synchronous rather than asynchronous and uses a lock to execute its delegates one at a time.
同样,the article that he wrote on synchronization contexts并链接到该评论建议:
Conceptually, the context of AspNetSynchronizationContext is complex. During the lifetime of an asynchronous page, the context starts with just one thread from the ASP.NET thread pool. After the asynchronous requests have started, the context doesn’t include any threads. As the asynchronous requests complete, the thread pool threads executing their completion routines enter the context. These may be the same threads that initiated the requests but more likely would be whatever threads happen to be free at the time the operations complete.
If multiple operations complete at once for the same application, AspNetSynchronizationContext will ensure that they execute one at a time. They may execute on any thread, but that thread will have the identity and culture of the original page.
在反射器中挖掘似乎验证了这一点,因为它在调用任何回调时都会锁定 HttpApplication
。
锁定应用程序对象似乎是一件可怕的事情。所以我的第一个问题:这是否意味着今天整个应用程序的所有异步完成一次执行一个,甚至是源自具有单独 HttpContext 的单独线程上的单独请求的异步完成?对于任何 100% 使用异步页面(或 MVC 中的异步 Controller )的应用程序来说,这不是一个巨大的瓶颈吗?如果没有,为什么不呢?我错过了什么?
此外,在 .NET 4.5 中,似乎有一个新的 AspNetSynchronizationContext
,旧的已重命名为 LegacyAspNetSynchronizationContext
,并且仅在新应用设置 时使用未设置 UseTaskFriendlySynchronizationContext
。那么问题#2:新的实现会改变这种行为吗?否则,我想随着新的 async/await 支持通过同步上下文编码(marshal)完成,这种瓶颈将更加频繁地被注意到。
this forum post的答案(链接自 SO 答案 here )表明这里发生了根本性的变化,但我想清楚这是什么以及哪些行为得到了改进,因为我们有一个 .NET 4 MVC 3 应用程序,它几乎是 100% 异步操作调用 Web 服务的方法。
最佳答案
我来回答你的第一个问题。在您的假设中,您没有考虑单独的 ASP.NET 请求由不同的 HttpApplication 对象处理的事实。 HttpApplication 对象存储在池中。一旦您请求一个页面,就会从池中检索一个应用程序对象并属于该请求,直到请求完成为止。那么,我对你的问题的回答:
all asynchronous completions for the entire app execute one at a time, even ones that originated from separate requests on separate threads with separate HttpContexts
是:不,他们没有
单独的请求由单独的 HttpApplication 对象处理,锁定的 HttpApplication 只会影响单个请求。同步上下文是一个强大的东西,可以帮助开发人员同步对共享(在请求范围内)资源的访问。这就是为什么所有回调都在锁定下执行。同步上下文是基于事件的同步模式的核心。
关于Asp.net SynchronizationContext 锁定 HttpApplication 以进行异步延续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11369614/
我有一个单页应用程序,前端是 Angular.js,后端是 Web api2,还使用 CaSTLe Windsor 和 SignalR。 我在维护服务器状态的服务器上使用 C# 组件。因此,在 A
我有一个 MVC3 应用程序,我向其中添加了几个简单的缓存变量作为属性。我在 Application_Start 中添加我的数据,然后在 Controller 中尝试将 HttpContext.App
我有一个派生自 HttpApplication 的类,它添加了一些额外的功能。我已经到了需要对这些功能进行单元测试的地步,这意味着我必须能够创建 HttpApplication 的新实例、伪造请求并检
我在设计 View 上制作了一个带有一些静态 HTML 的简单 Web 表单,在后面的代码中我添加了两个方法:Page_Load 和 Page_PreRender,如下所示: public parti
我使用了 this article 顶部的表格作为引用。我有三个问题: 1 - 多个用户(来自不同的物理位置)可以共享一个 HttpApplication 实例吗?如果是这样,这是默认发生的吗? 2
HttpApplication 异步事件(例如,使用AddOnEndRequestAsync 和 friend 注册的事件)在多大程度上是异步的? IIS 是否等待为特定事件触发的所有异步事件完成,然
我在我的 Global.asax 中覆盖了 Application_AuthenticateRequest() 以试图更好地理解事件流。我正在使用默认 MVC2 应用程序附带的成员身份提供程序。 我想
HttpApplication拥有特性Context哪个类是HttpContext . HttpContext 类和HttpApplication 类有一些共同的属性,比如User, Response
我在 Global.asax 中设置了各种全局参数,如下所示: Application["PagePolicies"] = "~/Lab/Policies.aspx"; Application["Pa
我正尝试在我的 MVC 应用程序上运行一些测试,但我一直在努力让它工作。我会尽量开门见山: 我正在使用 RhinoMocks 来尝试这样的事情: 设置: MockRepository mocks =
根据this MSDN article HttpApplication.EndRequest 可用于关闭或处置资源。但是,在我的应用程序中不会触发/调用此事件。 我们通过以下方式在 Page_Load
This comment通过 Stephen Cleary说的是: AspNetSynchronizationContext is the strangest implementation. It t
HttpApplication 类和 IHttpModule 有什么区别?它们是相同还是不同? 我看到文章在两个类(class)中都提到了相同的事件。 最佳答案 HttpApplication 是在其
我正在编写 HttpModule 并需要对其进行测试,我正在使用 C#、.NET4.5.2、NUnit 和 起订量。 我尝试测试的方法是Context_BeginRequest: public cla
我正在尝试向 .NET Mvc 应用程序中的每个请求添加一些请求上下文信息。我为此目的使用 LogicalCallContext,因为我的请求有时会调用异步任务。但是,我发现在 BeginReques
一本书展示了一个示例,其中(使用 IIS7 时)配置了以下模块,以便网站上运行的任何 Web 应用程序(甚至非 asp.net 应用程序)都可以使用它。但是: 如果为非 asp.net 应用程序调用此
我正在创建一个库,它需要在 ASP.NET 请求生命周期的各个阶段运行一些代码。 通过覆盖 HttpApplication.Init() 并在那里注册各种处理程序,在编写 Web 应用程序时很容易做到
我正在尝试为在 Application_Start 上加载的 ASPNET HttpApplication 测试“插件” . 代码是这样的: private HttpApplication appli
我的 Web 应用程序中有一个 HttpApplication (Global.asax),我用它来捕获和记录未处理的异常并设置 WebFormURLRouting。这一切都有效,但是我想将这段代码移
我有 global.asax,它从我创建的自定义类扩展而来,称为 MvcApplication,它从 System.Web.HttpApplication 扩展而来。 在它的构造函数中,它按照以下方式
我是一名优秀的程序员,十分优秀!