我制作了一个应用程序,里面有幻灯片。我在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();
}
答案 0 :(得分:0)
垃圾收集器使用启发式算法来优化某些操作。因此,您不能期望在不同的PC中出现内存问题的一致行为。
不要让你的一次性物品超出范围而不进行处理。您应该在创建新实例之前处置现有图像。
if (newImage != null)
newImage.Dispose();
newImage.Source = new BitmapImage(new Uri(_fileList[_imageCounter]));
修改强>
Bitmap
类是Image
类的实现。 Image类是一个抽象类。因此,使用一次性而不是Image的Bitmap。
Bitmap newImage;
....
mewImage.Dispose();