当前位置: 首页 > news >正文

网站开发教程 视频河南省建设厅网站门户

网站开发教程 视频,河南省建设厅网站门户,开发公司施工管理事业部领导如何同下属协调沟通,有投标功能的网站怎么做Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章 目录 前言1. 异常的发生来得太突然2. 问题所在3. 问题的解决方案前言 事情的起因是由于一段简单的数据库连接代码引起#xff0c;这段代码从语法上看#xff0c;是没有任何问题#xff1b;但是就是莫名其妙的报…Asp.Net Core 轻松学-经常使用异步的你,可能需要看看这个文章 目录 前言1. 异常的发生来得太突然2. 问题所在3. 问题的解决方案前言 事情的起因是由于一段简单的数据库连接代码引起这段代码从语法上看是没有任何问题但是就是莫名其妙的报错了这段代码极其简单就是打开数据库连接读取一条记录然后立即更新到数据库中。但是惨痛的事实证明老司机也是会翻车的。 1. 异常的发生来得太突然 1.1 引起不舒适的代码片段 [HttpPut]public async void Put([FromBody] TopicViewModel model){var topic this.context.Topics.Where(f f.Id model.Id).FirstOrDefault();topic.Content model.Content;this.context.Update(topic);var affrows await this.context.SaveChangesAsync();}这是一段不太标准的异步接口可能你也这么写过 从结构和语法上看这段代码没有任何问题而且正常情况下它还能执行成功 1.2 报错信息 从报错信息中可以看出数据库上下文对象被销毁了是在什么时候销毁的呢通过跟踪程序了解到是在 this.context.Update(topic); 调用 Update 后执行了 DbContext.Dispose()为了证明这点我们重写 DbContext.Dispose() 方法并简单的输出一句话 1.3 重写 DbContext.Dispose() public class ForumContext : DbContext{public ForumContext(DbContextOptionsForumContext options) : base(options){}public DbSetTopic Topics { get; set; }public DbSetPost Posts { get; set; }public override void Dispose(){base.Dispose();Console.WriteLine(Dispose);}}1.4 再次执行程序查看结果 通过输出结果红色方框处可以看到确实是在执行了 Update 以后执行了 Dispose 方法关于这点如果我们使用了同步方法先 Update 再 SaveChanges 这是没有任何问题的理论上说EFCore 中启用了 AutoDetectChangesEnabled我们在上面的代码中其实无需调用 Update直接 SaveChangesAsync 即可也不会抛出异常同理如果是在同步方法中先执行 Update 再 SaveChanges 也是没有任何问题的 1.5 同步 SaveChanges [HttpPut]public void Put([FromBody] TopicViewModel model){var topic this.context.Topics.Where(f f.Id model.Id).FirstOrDefault();topic.Content model.Content;this.context.Update(topic);Console.WriteLine(Updated);var affrows this.context.SaveChanges();Console.WriteLine(affrows:{0}, affrows);}输出结果从输出结果可知先执行了 Update,然后执行了 SaveChanges 输出 affrows最后执行了 Dispose 方法 2. 问题所在 那到底是什么问题引起了程序执行的不确定性呢答案就是 async/await我们先来尝试改进一下最初的代码 2.1 改进后的代码 [HttpPut]public async Task Put([FromBody] TopicViewModel model){var topic this.context.Topics.Where(f f.Id model.Id).FirstOrDefault();topic.Content model.Content;this.context.Update(topic);Console.WriteLine(Updated);var affrows await this.context.SaveChangesAsync();Console.WriteLine(affrows:{0}, affrows);}细心的你已经发现这段代码和 1.1 之中的没有太多的不同无非是增加了一些跟踪信息其中最关键的是增加了返回值为Task 替换了 void 2.2 再次执行修正的程序 输出结果和 1.5 中的同步方法完全相同至此问题解决 3. 问题的解决方案 3.1 问题分析 为什么会发生这种问题呢原因就是因为使用了异步方法 async/await 时当没有值需要返回时使用了 void 造成的正确的做法是如果没有返回值则返回 Task如果有返回值则使用 Task 当一个异步方法内部没有返回 Task 的时候基于任务的异步模式TAP并不知道异步任务的状态当 this.context.Update 执行完成后发现挂载在内存中的连接已经没有使用就执行了回收实际上此时程序还没有执行完成但是 TAP 并不知道所以它不会去阻止这个回收的过程使用标记所以 async/await 应该成对出现并且应该始终返回 Task 或者 Task以确保 TAP 能够将上下文进行正确的挂载否则当异常发生时TAP 无非将异常信息挂载到相应的 Task 上亦无法跟踪其执行状态等信息 3.2 解决方案 请牢记下面的铁律 3.2.1 在 EFCore 中应当始终发挥 AutoDetectChangesEnabled 的特性不要再更新实体的时候去调用 Update 方法3.2.2 使用 async/await 修饰方法时应该始终返回 Task 或者 Task适当的使用同步方法可避免异步踩坑演示代码下载 https://github.com/lianggx/EasyAspNetCoreDemo/tree/master/Ron.TaskThird
http://www.pierceye.com/news/713842/

相关文章:

  • 大理装饰公司做网站网站建设费用:做个网站要多少钱?
  • 简约的网站设计界面百度收录网站左侧图片
  • 对建设网站未来发展的建议教育 网站模板
  • 做篮球网站用的背景图广州黄埔做网站的公司
  • 爱客源seo怎么刷关键词排名
  • 自己做网站网页文件在哪里公司官网定制
  • 网站建设怎么样工作室哪个网站可以免费制作h5
  • 做网站学的是代码吗机器封所有端口 不支持做网站
  • 类似于美团的网站开发两学一做网站专栏怎么设置
  • 天津seo网站管理千川推广官网
  • 技术支持 光速东莞网站建设企业信息免费查询系统
  • 网站设计主流尺寸weui wordpress模板
  • 汕头市网站建设商机互联网站建设
  • 口碑好的网站建设苏州园区做网站公司
  • 网站互联网设计图风格网站服务器异常是什么意思
  • 有哪些好的做兼职网站有哪些免费做ppt的网站
  • 学生成绩管理系统网站建设上海公共招聘网12333官网
  • 邵东做网站的公司wordpress修改文章字体颜色
  • 那个网站百度收录快天河高端网站建设
  • 网站建设 客户拜访wordpress设置新页面
  • 做百度推广送的网站网站建设中gif
  • 网站风格介绍wordpress怎么给产品编号
  • 站长聚集地深圳网络提速优化服务包
  • 西安外贸网站建设公司网站域名过期后续费多长时间生效
  • 网站制作资质2017建设厅网站
  • 网站系统开发毕业设计哈尔滨seo优化软件
  • 南通企业网站网站制作的书籍
  • 长沙网站收录怎么网站能找人做装修事
  • 鞍山网站制作谁家好2021没封的网站有人分享吗
  • 网站建设公司net2006iis虚拟网站