仅在Win8下storyboard中的内存泄漏
本文关键字:内存 泄漏 storyboard Win8 仅在 | 更新日期: 2023-09-27 18:08:26
我做了一个应用程序,其中有一个幻灯片。我在5台电脑上运行这个应用程序。3 Win7和2 Win8(都是x64,我的应用程序是x86)。在Win7-PC上我没有问题。在Win8下,我得到(在不可预测的时间之后)一些错误信息。outofmemory异常和UCEERR_RENDERTHREADFAILURE (HRESULT: 0x88980406)。微软是这样说的:
- 如果系统。报告outofmemoryexception,然后在性能监视器中监视进程的内存使用情况;特别是进程'虚拟字节,进程'私有字节和。net CLR内存#字节在所有堆计数器。还要在Windows任务管理器中监视该进程的用户对象和GDI对象。如果您可以确定某个特定的资源正在耗尽,那么就对应用程序进行故障排除,以修复导致资源消耗的任何原因。最终,这将解决System.OutOfMemoryException。
我不能只监视系统,等待错误发生1到5天。也许有人能看出我代码中的错误?
下面是我的xhtml代码:
<Window.Resources>
<Style x:Key="ImgZIndexStyle" TargetType="{x:Type Image}">
<Setter Property="Panel.ZIndex" Value="2"/>
<Style.Triggers>
<Trigger Property="Image.Opacity" Value="1">
<Setter Property="Panel.ZIndex" Value="3"/>
</Trigger>
</Style.Triggers>
</Style>
<Storyboard x:Key="FaderStoryboardHide1Show2">
<DoubleAnimation Storyboard.TargetName="FirstImage"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:00:01" />
<DoubleAnimation Storyboard.TargetName="SecondImage"
Storyboard.TargetProperty="Opacity"
To="1" Duration="0:00:01" />
</Storyboard>
<Storyboard x:Key="FaderStoryboardHide2Show1">
<DoubleAnimation Storyboard.TargetName="SecondImage"
Storyboard.TargetProperty="Opacity"
To="0" Duration="0:00:01" />
<DoubleAnimation Storyboard.TargetName="FirstImage"
Storyboard.TargetProperty="Opacity"
To="1" Duration="0:00:01" />
</Storyboard>
</Window.Resources>
<Grid>
<Grid Name="SlideShowGrid" ZIndex="0">
<Button Name="SlideShowButton" Click="SlideShowButton_OnClick">
<Grid>
<Image x:Name="FirstImage" Stretch="UniformToFill" Style="{StaticResource ImgZIndexStyle}" Opacity="1" />
<Image x:Name="SecondImage" Stretch="UniformToFill" Style="{StaticResource ImgZIndexStyle}" Opacity="0" />
</Grid>
</Button>
</Grid>
</Grid>
And my Class:
private void SlideShowTimer_Tick(object sender, EventArgs e)
{
Image newImage;
Storyboard tempStoryboard;
if (FirstImage.Opacity == 1)
{
tempStoryboard = (Storyboard)FindResource("FaderStoryboardHide1Show2");
newImage = SecondImage;
}
else
{
tempStoryboard = (Storyboard)FindResource("FaderStoryboardHide2Show1");
newImage = FirstImage;
}
if (_imageCounter >= _fileList.Count - 1)
_imageCounter = 0;
else
_imageCounter++;
newImage.Source = new BitmapImage(new Uri(_fileList[_imageCounter]));
tempStoryboard.Begin();
}
垃圾收集器使用启发式算法来优化某些操作。所以,你不能期望你的内存问题在不同的pc一致的行为。
不要让您的一次性对象在没有处理的情况下超出范围。在创建新实例之前,应该先处理现有的映像。
if (newImage != null)
newImage.Dispose();
newImage.Source = new BitmapImage(new Uri(_fileList[_imageCounter]));
编辑
Bitmap
类是Image
类的实现。Image类是一个抽象类。所以,使用一次性的位图,而不是图像。
Bitmap newImage;
....
mewImage.Dispose();