仅在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();
    }
    

    仅在Win8下storyboard中的内存泄漏

    垃圾收集器使用启发式算法来优化某些操作。所以,你不能期望你的内存问题在不同的pc一致的行为。

    不要让您的一次性对象在没有处理的情况下超出范围。在创建新实例之前,应该先处理现有的映像。

    if (newImage != null)
        newImage.Dispose();
    newImage.Source = new BitmapImage(new Uri(_fileList[_imageCounter]));
    

    编辑

    Bitmap类是Image类的实现。Image类是一个抽象类。所以,使用一次性的位图,而不是图像。

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