gpt4 book ai didi

c# - 仅在 Win8 下 Storyboard中的内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-03 15:35:13 26 4
gpt4 key购买 nike

我做了一个应用程序,里面有一个幻灯片。我在 5 台电脑上运行这个应用程序。 3 个 Win7 和 2 个 Win8(都是 x64,我的应用程序是 x86)。在 Win7-PC 上我没有问题。在 Win8 下,我收到(在不可预测的时间后)一些错误消息。OutOfMemory 异常和 UCEERR_RENDERTHREADFAILURE (HRESULT: 0x88980406)。微软是这样说的:

  1. If System.OutOfMemoryExceptions are being reported, then monitor the process's memory usage in Performance Monitor; particularly the Process\Virtual Bytes, Process\Private Bytes, and .NET CLR Memory# Bytes in All Heaps counters. Also monitor the User Objects and GDI Objects for the process in Windows Task Manager. If you can determine that a specific resource is being exhausted, then troubleshoot the application to fix whatever is causing that resource consumption. Ultimately that should resolve the 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>

还有我的类(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 而不是 Image。

Bitmap newImage;
....
mewImage.Dispose();

关于c# - 仅在 Win8 下 Storyboard中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com