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

电商网站开发多少钱网站设计前期沟通单

电商网站开发多少钱,网站设计前期沟通单,玉环哪里有做网站,域名出售后被用来做非法网站背景 在开发中由于对语言特性不了解或经验不足或疏忽,往往会造成一些低级bug。而内存泄漏就是最常见的一个,这个问题在测试过程中,因为操作频次低,而不能完全被暴露出来;而在正式使用时,由于使用次数增加&…

背景

在开发中由于对语言特性不了解或经验不足或疏忽,往往会造成一些低级bug。而内存泄漏就是最常见的一个,这个问题在测试过程中,因为操作频次低,而不能完全被暴露出来;而在正式使用时,由于使用次数增加,这个问题在很快就会出现。一旦出现就会导致程序直接退出或报错……使用中得益于使用量的增加,未被回收的小对象不断实例化,数量的叠加,导致内存使用率会随时间的增长而增加,直到影响程序的正常执行。

为了警醒鄙人,同时方便以后查阅,将在项目中实际处理的内存泄漏情况与处理办法进行下述总结。

常见泄漏

在C#中常见的内存泄漏主要是由于事件订阅造成:

  1. 实例类订阅静态类事件,不使用当前实例时未取消订阅,导致静态类中一直持有订阅方实例类,实例类不能释放,而每次使用时不断实例化后实例数量不断增加。
  2. 实例类中有类似timer之类定时运行的对象未释放(未dispose),导致实例类不能回收,而实例类仍不断实例化。
  3. 实例类中订阅了另一个实例类中的事件,但另一个实例类的生命周期很长(如果生命周期短,订阅方在使用完后,若被订阅方之后也完成了使命,理论上是可以很快被GC回收的),同时订阅方在未使用时也未及时取消订阅,导致被订阅方长时间持有订阅实例。
  4. 其它订阅未取消的情况。

实例类订阅静态类事件,但未取消订阅

若在构造函数中订阅静态类FolderSelect中的AllFolderg事件:

FolderSelect folderSelect = FolderSelect.Instance;
folderSelect.AllFolder += FolderSelect_AllFolder;

如果在不使用时,不执行 folderSelect.ScanAllFolder -= FolderSelect_ScanAllFolder;就会导致FolderSelect静态类一直持有订阅类,导致订阅类不能被回收。

同时由于实例类,在实例化时会运行构造函数,生成新的实例时会再次将新实例又再次订阅这个事件。那么当FolderSelect触发AllFolder事件时,新、旧实例都会执行FolderSelect_AllFolderg事件,这也可能导致一些不必要的问题。

实例类中timer未释放

在某些情况下,在对象类中会使用timer,而timer在不使用时,一定要dispose掉。由于timer在执行定时事件时会一直持有当前的对象,从而导致对象不能被回收。另.net中涉及到的timer有6种,详细见Timer Class (System.Threading) | Microsoft Learn中的详细介绍。

实例类订阅长生命周期实例类

以WINUI中常用的异常捕捉为例,若在Page的构造函数中添加了下述代码:

 AppDomain.CurrentDomain.FirstChanceException += CurrentDomain_FirstChanceException;

即每次实例化这个Page时都会订阅CurrentDomain_FirstChanceException这个方法,而AppDomain的生命周期与程序一致,导致它会一直持有当前订阅方的实例,从而订阅方不能被回收。

其他订阅未取消

WINUI ComboBoxItem事件未取消

WINUI中的对ComboBox中的ComboBoxItem单独添加了Tapped事件,而这个Tapped事件若在不使用时未取消订阅,也会引起当前使用的对象不能被回收。

在WINUI中的ComboBox的UI代码如下:

<ComboBoxx:Name="ComboOrder"Width="268"Height="70"Margin="5,0,5,0"VerticalAlignment="Center"BorderThickness="0"FontSize="38"Foreground="White"Loaded="ComboOrder_Loaded"SelectedIndex="0"Style="{StaticResource DefaultComboBoxStyle2}"Tag="180"ToolTipService.ToolTip="排序"><ComboBoxItemx:Name="CbiPatientName"Content="患者名"Style="{StaticResource ComboBoxItemRevealStyle2}"Tag="0"Tapped="CbiName_Tapped" /><ComboBoxItemx:Name="CbiImportTime"Content="时间"Style="{StaticResource ComboBoxItemRevealStyle2}"Tag="0"Tapped="CbiImportTime_Tapped" /><ComboBoxItemx:Name="CbiPlanPhase"Content="阶段"Style="{StaticResource ComboBoxItemRevealStyle2}"Tag="0"Tapped="CbiPlanPhase_Tapped" /></ComboBox>

在上述代码中,为ComboBoxItem添加了Tapped事件,正是这个事件导致程序在退出ComboBox所在页时,它所在的Page不能及时被回收,导致再次进入时会新增它所在的Page实例。为了避免此问题,不得以重写离开页面方法 protected override void OnNavigatingFrom(NavigatingCancelEventArgs e),在这个方法中将ComboBoxItem的绑定事件全部取消。

可能原因:ComboBoxItem为ComboBox的子控件,导致ComboBoxItem的tapped事件的引用可能形成了闭包,导致它所在的Page不能被回收。后续搞清楚原因再做相应更新。

取消订阅

取消订阅——对于事件订阅造成的内存泄漏,当然是在不使用当前对象时,就及时将它订阅的事件取消订阅即可。详细可参考如何订阅和取消订阅事件 - C# 编程指南 - C# | Microsoft Learn最下方的取消订阅栏。

弱事件管理——另外事件也可以使用弱引用进行相应的操作,详细见MSDNWeakEventManager 类 (System.Windows) | Microsoft Learn。

利用诊断预防内存泄漏

除了在编程时就养成使用完订阅事件就马上取消,另外在进行测试时也可以通过VisualStudio提供的诊断工具进行诊断。使用方法如下,详细参见MSDN。

诊断工具下方,选择内存使用率,然后在内存使用率的面板左上角点击截取快照,截取完成后如下,再点击对象(差异)即可查看对象数量的情况。

在点击上图中的红圈后,如下图,在下图中左上角类型面板中搜索查看的对象。另还可在下图右上角与基线进行比较中选择一个你要比较的前一个内存快照。

http://www.sczhlp.com/news/73872/

相关文章:

  • 电子商城网站开发项目描述住房和城乡建设厅官网证件查询
  • 网站开发使用什么运行软件平台类网站建设公司
  • 怎么优化网站打开速度茌平建设局网站
  • 宿州网站开发建设广州外发加工网
  • 设计软件免费下载官方网站wordpress插件必备
  • 织梦手机网站怎么做wordpress离线写文章
  • 济宁亿峰科技做网站一年多少费用wordpress图片500
  • 制作做动画的网站站长工具seo排名查询
  • 珠海做公司网站人力资源网站建设计划书
  • 天津旅游网站建设自己做网站好不好
  • 网站建设售前wordpress搬站流程
  • 下载ppt模板免费的网站做企业网站要多长时间
  • 网站开发属于什么行业微信开发者平台小程序
  • 免费网站建设视频教程七台河新闻在线直播
  • 设计招聘专业网站专业提供网站建设服务包括
  • 商河做网站多少钱做娱乐网站彩票代理
  • 校园论坛网站怎么做wordpress4.9主题
  • 秦皇岛网站制作哪个好网站平台搭建怎么弄的
  • 浙里建官方网站建设银行官方网站下载
  • 中国怎么进fiverr网站做任务电子商务网站建设体会
  • 济南正规做网站公司深圳做手机商城网站建设
  • 百度只更新快照不收录网站嘉兴网站建设制作
  • 做的比较早的海淘网站微信公共平台wordpress
  • 建设学风建设专题网站wordpress后台管理地址更改
  • 创建自己的博客网站吗简述制作h5的基本流程
  • 惠州网站建设培训加强网站建设 基本措施
  • 凡科建站步骤简单的设计网站
  • 广州做网站优化费用深圳网站设计权威乐云践新
  • 网站建设市场趋势移动电商网站
  • jsp两种网站开发模式智慧团建手机版