加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – 跨线程使用HTTPContext

发布时间:2020-12-15 22:42:25 所属栏目:asp.Net 来源:网络整理
导读:用户点击页面spawn.aspx,然后生成六打线程,渲染页面全部使用 ((System.Web.IHttpHandler)instance).ProcessRequest(reference to spawn's HTTPContext); 不要担心ASP.Net似乎是发送用户7个响应1请求,该部分被处理,只有一个响应被发送. 问题在于,在高流量环境
用户点击页面spawn.aspx,然后生成六打线程,渲染页面全部使用
((System.Web.IHttpHandler)instance).ProcessRequest(reference to spawn's HTTPContext);

不要担心ASP.Net似乎是发送用户7个响应1请求,该部分被处理,只有一个响应被发送.

问题在于,在高流量环境(我们的生产环境)中有许多线程(四分之一)),我们会发现错误:

06001

我们不能在其他地方复制.我的同事认为这是因为我正在重用原始的HTTPContext并将其传递给其他线程,而且它不是线程安全的.

按照这个逻辑,我已经尝试使一个新的HTTPContext进入线程.但它的一部分似乎不会“结合”.具体来说,我需要将Session对象转换成新的HTTPContext.我想我想要得到其他部分,像缓存.对于记录HTTPContext.Current.Session.IsSynchronized为false.

我的问题是:

>你认为这个错误是从跨线程使用HTTPContext吗?
>如何解决?
>如果修复是复制每个线程的HTTPContext,我该如何获得新的Session(和缓存)?请求和响应进入ctor,但会话不可设置.

编辑:更多细节

所以回到这个声明:“不要担心ASP.Net似乎是发送用户7个响应1请求,只有一个响应被发送.”雷蒙德陈的巨大粉丝,我同意你的看法:“现在你有两个问题”是没有任何更多信息的合理的声明.

实际发生的是我正在构建一个要发回的Excel文档.在spawn.aspx页面中,它设置了一些状态信息,包括将其渲染为excel的事实,以及要执行渲染的对象.每个生成的页面都会获取该信息,并且将阻止它们轮到渲染到该对象.如果字面上看起来像这样:

protected override void Render(System.Web.UI.HtmlTextWriter writer)
 {
    if (this.RenderToExcel)
    {
      Deadlocker.SpinUntilCurrent(DeadLockToken);
      RenderReport(this,this.XLSWriter);
      Deadlocker.Remove(DeadLockToken);
    }
    else
      base.Render(writer);
 }

但是到目前为止所有的处理 – 数据库访问,控制权力,所有这些都是并行完成的.而且还有很多 – 足够让它变得模棱两可,而仍然让它阻挡在渲染上会将整个时间缩短一半以上.

而最好的部分是 – 没有什么必须重写为Excel渲染.所有控件都知道如何使自己成为excel,而且您可以独立访问每个生成的页面(实际上是“正常情况”) – excel报告只是所有生成页面的聚合.)

所以我认为最终的结果将是“你不能这样做,你需要重新思考这种方法” – 但是我至少要尝试一下,因为事实上一切都很好,没有重复任何逻辑或任何代码或必须抽象任何东西才是完美的.它只是多线程的问题,如果我连续渲染页面一切都很好,只是缓慢.

解决方法

虽然HttpContext旨在处理不是特定于线程的上下文(因为http上下文可以在一个线程上启动并在另一个线程上完成),但它不是隐式线程安全的.

本质上问题在于你正在做一些不想要的事情,这些请求一般是多个,每个都有自己分配的HttpApplication来满足请求,每个都有自己的HttpContext.

我真的会尝试让asp.net基础架构委托请求本身.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读