ASP.NET mvc使用多线程操作数据库报错,连接方式是dbfirst

gogoed 2017-11-28 10:33:03
错误:The request lifetime scope cannot be created because the HttpContext is not available.
中文:由于HttpContext不可用,所以不能创建请求生命周期范围。


...全文
380 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
实际上你应该贴出具体的 vs 中断调试画面,说明具体的错误语句。否则只能像 #3 楼那样来猜你的代码的异常语句。显然这个 bug 问题其实跟访问数据库无关,这跟访问 HttpContext 有关。所以你要找你的代码使用了页面处理进程 HttpContext 对象引用的地方。
  • 打赏
  • 举报
回复
asp.net 处理客户端刷新页面的一个请求(也就是一个页面生命周期)时,在一个子线程中顺序地(阻塞式地而非异步地)处理了一系列事件,然后输出 html 就结束了。这个过程中你另外启动了子线程,你的子线程的生命周期往往是比它的父线程的页面生命周期长。也就是说页面处理过程早就处理完了、html 输出了、Response 关闭了、函数结束了、一大堆临时数据对象都释放掉了,你的子线程还在刚刚开始访问数据库呢。 可能你把 asp.net 看成了 winform、wpf。它们是不一样的机制。
  • 打赏
  • 举报
回复
使用子线程来操作数据库没什么问题,但是你为什么要操作 HttpContext 啊? asp.net 默认的行为方式,就是在服务器端瞬间响应一下客户端请求,然后立刻输出(重新输出)页面 html 就结束了。这个生命周期是一瞬间的。在你的子线程中的过程还没有访问完数据库(甚至可能还没有执行什么代码)时可能就已经结束了页面生命周期。当某用户在浏览器的某个业务页面上反复操作时(例如修改一个订单时),asp.net 传统机制其实可能需要成千上万个页面生周期。所以知道什么叫做 asp.net 页面生命周期是 asp.net 编程的最基本概念。
webdiyer 2017-11-30
  • 打赏
  • 举报
回复
你的GetClientIP方法用到HttpContext了吧
江湖评谈 2017-11-28
  • 打赏
  • 举报
回复
httpmodule管道模型分发请求或者get来就是个线程池变量,你多线程起码要同步当前handler线程句柄,才能获得正确的context
丰云 2017-11-28
  • 打赏
  • 举报
回复
不要自己new thread了,这种做法已经过时了,很容易出错!! 用线程池吧,简单安全: ThreadPool.QueueUserWorkItem(new WaitCallback(OrderInfo.Run));
正怒月神 版主 2017-11-28
  • 打赏
  • 举报
回复
我用的task。 你每次的上下文,都要新建。而不是多个线程同时使用一个,这样就没问题了。
private void Form1_Load(object sender, EventArgs e)
        {
            Task t1 = new Task(Add);
            Task t2 = new Task(Add);
            Task t3 = new Task(Add);
            t1.Start();
            t2.Start();
            t3.Start();
            Task.WhenAll(t1, t2, t3);

        }
        
        
        public void Add()
        {
            MoviesEntities db = new MoviesEntities();
            var q = new Movies() { Title="1",Price=100};
            db.Movies.Add(q);
            db.SaveChanges();
        }

62,052

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧