惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - 思无邪

Silverlight内存泄露(七)Command Silverlight内存泄露(六)MEF等Ioc框架引起内存泄露-ExportLifetimeContext Silverlight内存泄露(五)MEF等Ioc框架引起内存泄露-PartCreationPolicy Silverlight内存泄露(四)解决内存泄露 Silverlight内存泄露(二)检测内存泄露 从火狐放弃依据特性更新版本说起 Silverlight内存泄露(二)解决内存泄露之Dispose误用 Silverlight内存泄露(一)序 Silverlight IReader阅读器第二版 silverlight阅读器——面向领域的浏览器(二)——Silverlight阅读器架构 silverlight阅读器——起源面向领域的浏览器——概念 silverlight异步陷阱(二)循环 silverlight 异步陷阱(一)不能Remove事件处理程序 IReader Silverlight电子阅读器介绍开源项目 silverlight在线阅读器(二):为silverlight增加gb2312编码 silverlight在线阅读器(一):介绍 新建立一个类似于CuteEditor的项目,希望有人参加。发布一个测试版本的dll 从控件开发的角度看几个editor控件,Freetextbox,radtoolbar,abouteditor,cuteeditor 想做一个关于word解析和HtmlEditor的项目,希望有人加入 cuteEditor6.0的破解方式与Cuteeditor6.0的脚本调试
Silverlight内存泄露(八)样式
思无邪 · 2011-04-18 · via 博客园 - 思无邪

同一个程序,换一个主题、换一个样式,可能造成内存泄露。

演示Sytle引起的内存泄露

这一系列写到八了,将要结束,还没有一个直观例子说不过去,样式发生内存问题最难找也最隐蔽,做了小例子说明内存泄露问题。

例子下载:

MemoryLeak.rar 

例子中ProgressBar样式引起内存泄露,为直观每次导航分配50M内存。

a) 继续使用ANTS检测内存问题,但ANTS属于收费软件

b) 也可使用免费的进程浏览器,启动 Process Explorer.,在sllauncher.exe进程右击,选择属性,在Home、About间导航。

clip_image002

每次导航内存增加50M

clip_image004

注释掉ProgressBar样式后,内存不增加。

查找内存泄露

给程序更换样式后发现,View不能释放,没导航内存都增加一个View实例。查看其中一个内存关系图,如下:

clip_image006

可看到某个动画的引用不能释放。造成View不能释放

ProgressBar样式造成内存泄露

产生内存泄露的样式:

<!--progressbar 内存泄露-->
<Style TargetType="ProgressBar">
<Setter Property="BorderThickness" Value="2"/>
<Setter Property="Maximum" Value="100" />
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ProgressBar">
<Grid x:Name="Root">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Determinate"/>
<VisualState x:Name="Indeterminate">
<Storyboard>
<ObjectAnimationUsingKeyFrames BeginTime="0"
Storyboard.TargetName
="ProgressBarRootGrid"
Storyboard.TargetProperty
="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Collapsed"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames BeginTime="0"
Storyboard.TargetName
="ProgressBarIndeterminateRootGrid"
Storyboard.TargetProperty
="Visibility">
<DiscreteObjectKeyFrame KeyTime="0" Value="Visible"/>
</ObjectAnimationUsingKeyFrames>
<DoubleAnimation Storyboard.TargetName="tr" Storyboard.TargetProperty="X"
Duration
="0:0:2" To="0.8" AutoReverse="True" RepeatBehavior="Forever">
<DoubleAnimation.EasingFunction>
<QuadraticEase EasingMode="EaseInOut" />
</DoubleAnimation.EasingFunction>
</DoubleAnimation>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="gs2" Storyboard.TargetProperty="Offset"
BeginTime
="0:0:0" Duration="0:0:4"
RepeatBehavior
="Forever">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="0.1"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2" Value="0"/>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="gs3" Storyboard.TargetProperty="Offset"
BeginTime
="0:0:0" Duration="0:0:4"
RepeatBehavior
="Forever">
<DiscreteObjectKeyFrame KeyTime="0:0:0" Value="0.2"/>
<DiscreteObjectKeyFrame KeyTime="0:0:2" Value="0.1"/>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Border x:Name="ProgressBarTrack" CornerRadius="4"
Background
="{TemplateBinding Background}"
BorderThickness
="{TemplateBinding BorderThickness}"
BorderBrush
="{TemplateBinding BorderBrush}" />
<Grid x:Name="ProgressBarRootGrid" >
<Rectangle HorizontalAlignment="Left" x:Name="ProgressBarIndicator"
Margin
="3" RadiusX="3" RadiusY="3"
Fill
="{TemplateBinding Foreground}"/>
</Grid>
<Grid x:Name="ProgressBarIndeterminateRootGrid" Visibility="Collapsed">
<Rectangle Margin="3" RadiusX="3" RadiusY="3" >
<Rectangle.Fill>
<LinearGradientBrush StartPoint="0 0.5" EndPoint="1 0.5">
<LinearGradientBrush.RelativeTransform>
<TranslateTransform x:Name="tr" X="0"/>
</LinearGradientBrush.RelativeTransform>
<GradientStop x:Name="gs0" Offset="0" Color="Transparent"/>
<GradientStop x:Name="gs1" Offset="0" Color="Transparent"/>
<GradientStop x:Name="gs2" Offset="0" Color="#CCCCFF"/>
<GradientStop x:Name="gs3" Offset="0.2" Color="#CCCCFF"/>
<GradientStop x:Name="gs4" Offset="0.2" Color="Transparent"/>
<GradientStop x:Name="gs5" Offset="1" Color="Transparent"/>
</LinearGradientBrush>
</Rectangle.Fill>
</Rectangle>
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

结论

a) 估计是Silverlight4bug,silverlight5没测试。

b) 慎用第三方样式

安装Silverlight5的问题

Silverlight5安装不上,有知道怎么解决下面问题的请回复。

clip_image008