【发布时间】:2015-11-11 11:12:19
【问题描述】:
我制作了一个应用程序,其中包含幻灯片。我在 5 台电脑上运行这个应用程序。 3个Win7和2个Win8(都是x64,我的应用是x86)。 在 Win7-PC 上我没有问题。 在 Win8 下,我收到(经过一段不可预测的时间)一些错误消息。 OutOfMemory 异常和 UCEERR_RENDERTHREADFAILURE (HRESULT: 0x88980406)。 微软对此表示:
- 如果正在报告 System.OutOfMemoryExceptions,则在性能监视器中监视进程的内存使用情况;特别是所有堆计数器中的 Process\Virtual Bytes、Process\Private Bytes 和 .NET CLR Memory# Bytes。还要在 Windows 任务管理器中监视进程的用户对象和 GDI 对象。如果您可以确定特定资源正在耗尽,则对应用程序进行故障排除以修复导致该资源消耗的任何原因。最终应该会解决 System.OutOfMemoryException。
我不能等待 1 到 5 天,只监视系统并等待错误发生。但也许你们中的某些人可以看到我的代码中的错误?
这是我的 XAML 代码:
<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>
还有我的班级:
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();
}
【问题讨论】:
-
看来您需要在分配新图像之前处理您以前的图像
newImage.Source -
但是我只设置了一个新的源,并没有创建一个新的图像对象。还是我误解了什么? “newImage = SecondImage”不就是对SecondImage的引用吗?
-
newImage.Source=img1; newImage.Source=img2;现在你失去了对img1的引用而没有释放它的资源...... -
我建议使用内存分析器,即使您必须让它运行并记录 4 或 5 个小时并且您没有收到错误,它仍然应该向您显示内存泄漏的位置是。
-
@RonBeyer:是的,但是错误只发生在 Win8 上,而我的 VS 在 Win7 上。我不知道如何在没有 VS 的情况下使用内存分析器。
标签: c# .net wpf memory-management memory-leaks