仅Win8下的故事板中的内存泄漏?

时间:2015-08-18 13:23:40

标签: c# .net wpf memory-management memory-leaks

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

  
      
  1. 如果报告了System.OutOfMemoryExceptions,则在性能监视器中监视进程的内存使用情况;特别是所有堆计数器中的Process \ Virtual Bytes,Process \ Private Bytes和.NET CLR Memory#Bytes。还可以在Windows任务管理器中监视进程的用户对象和GDI对象。如果您可以确定特定资源正在耗尽,则对应用程序进行故障排除以修复导致该资源消耗的任何问题。最终应解决System.OutOfMemoryException。
  2.   

我不能等待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();
}

1 个答案:

答案 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();