从本地系统缓存使用Font时出现'System.OutOfMemoryException'

时间:2010-08-06 07:16:07

标签: c# .net silverlight-4.0

我有一个silverlight幻灯片类型应用程序,有多个幻灯片可以显示文本。每张幻灯片可能有许多TextBlock。我们要求在运行时创建每个TextBlock添加到不同的面板中。对于每个TextBlock,我们分配TextBlock.Fontsource = new Fontsource(stream)的值。这个'stream'数据是ARIALUNI.TTF(22 MB)字体,这是通过应用程序在系统本地缓存中下载,我们读取其内容并将其分配给TextBlock。     在一些幻灯片之后,它会出现此异常

  

'的System.OutOfMemoryException'       在System.Windows.Documents.FontSource.SetTextFontSourceFromStream(DependencyObject obj)      在System.Windows.Controls.TextBox.UpdateFontSource(FontSource fontSource)      在System.Windows.Controls.TextBox.set_FontSource(FontSource值)      在TestSlideControl.ShowData()

先谢谢, DNM

2 个答案:

答案 0 :(得分:3)

难怪你得到OutOfMemoryException。 AFAIK隔离存储大小默认最大为1MB。您可以提示用户增加该值(IncreaseQuotaTo())或使用较小的字体(可选)。

修改:关于评论。

我在原帖中注意到您为TextBlock.Fontsource = new Fontsource(stream)执行了TextBlock! 这意味着您创建的每个TextBlock大约为22MB。因此,对于100个TextBlock,您会消耗 2.2GB 的内存 你应该缓存变量AND以某种方式使用较小的字体。你可以使它成为一个静态属性,只在第一次使用时创建(或者如果你每次都使用它,只是一个由构造函数初始化的静态属性):

public static class FontCache
{
    public static FontSource MyCoolFontSource { get; set; }

    static FontCache()
    {
        using (Stream fontStream = ...)
        {
            FontCache.MyCoolFontSource = new FontSource(fontStream);
        }
    }
}

并在代码中:

TextBlock.Fontsource = FontCache.MyCoolFontSource;

另请注意,您应该从隔离存储空间Application.GetResourceStream流式传输字体。

答案 1 :(得分:0)

如果您生成的每个TextBlock使用相同的字体,则应为每个Style分配一个字段。该样式可以建立您要使用的字体以及您要共享的任何其他常用属性。