C# 使用WriteableBitmapEx呈现TextBlock时OutOfMemoryException

C# 使用WriteableBitmapEx呈现TextBlock时OutOfMemoryException,c#,windows-phone-8,C#,Windows Phone 8,我又和OutOfMemoryException打架了 我有一个代码片段,可以通过在WindowsPhone后台代理任务中使用来呈现一些图像,该任务的内存使用限制接近10M 以下几点效果不错: Deployment.Current.Dispatcher.BeginInvoke(() => { var wbBG = BitmapFactory.New(0, 0); var bmp = BitmapFactory.New(0, 0); for (int i = 0; i

我又和OutOfMemoryException打架了

我有一个代码片段,可以通过在WindowsPhone后台代理任务中使用来呈现一些图像,该任务的内存使用限制接近10M

以下几点效果不错:

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    var wbBG = BitmapFactory.New(0, 0);
    var bmp = BitmapFactory.New(0, 0);
    for (int i = 0; i < 30; i++)
    {
        using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
        {
            wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg");                          
            wbBG.Invalidate();

            for (int j = 0; j < 6; j++)
            {
                bmp = BitmapFactory.New(0, 0).FromContent("Assets/" + j + ".png");
                bmp = bmp.Resize(60, 60, WriteableBitmapExtensions.Interpolation.Bilinear);

                wbBG.Blit(new Rect(j * 65, 0, 60, 60), bmp, new Rect(0, 0, 60, 60));
                wbBG.Invalidate();
            }
            string filenameBG = "/Shared/" + i + ".jpg";
            using (var stream = iso.CreateFile(filenameBG))
            {
                wbBG.SaveJpeg(stream, 480, 800, 0, 85);
                stream.Close();
            }
            wbBG = null;
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
    }
    NotifyComplete();
});
知道为什么文本块会导致更多的内存使用吗

此外,我认为没有更好的方法在图像上渲染文本

此外,文本块不可识别


嗯,这是我的意见,可能是错的,我会感谢任何帮助,谢谢

我不知道这个库,但是您忘记了在资源不再使用时释放它们,所以请尝试以下方法:

        for (var i = 0; i < 30; i++)
        {
            using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg"))
                {
                    wbBG.Invalidate();

                    for (int j = 0; j < 6; j++)
                    {
                        var tb = new TextBlock()
                        {
                            Text = j.ToString(),
                            //FontSize = 13,
                            //Height = 20,
                            //Width = 240,
                            //FontWeight = System.Windows.FontWeights.Bold,
                            //HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
                            //Foreground = new SolidColorBrush(Colors.White)
                        };
                        wbBG.Render(tb, new TranslateTransform() { X = j * 65, Y = 350 });
                        wbBG.Invalidate();
                    }
                    using (var stream = iso.CreateFile("/Shared/" + i + ".jpg"))
                    {
                        wbBG.SaveJpeg(stream, 480, 800, 0, 85);
                    }
                }
            }
        }

什么是BitmapFactory?您知道您正在尝试渲染30个图像,并且有180个渲染调用吗?另外,为什么不在内部循环中构造控件并将6个调用减少为一个呢?另外,如果在第一个循环之前加载一次图像,就不会加载30次。那么为什么第一个可以工作呢?顺便说一句,我必须在每个循环中加载不同的图像。嗨,彼得,谢谢你的帮助,很抱歉延迟回复,我被一些紧急任务卡住了。是的,我同意我需要释放我使用的资源,但是,BitmapFactoryWriteableBitmap以及TextBlock不可识别,因此我不能使用using block或Close方法。
        for (var i = 0; i < 30; i++)
        {
            using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
            {
                using (var wbBG = BitmapFactory.New(0, 0).FromContent("Assets/image" + i + ".jpg"))
                {
                    wbBG.Invalidate();

                    for (int j = 0; j < 6; j++)
                    {
                        var tb = new TextBlock()
                        {
                            Text = j.ToString(),
                            //FontSize = 13,
                            //Height = 20,
                            //Width = 240,
                            //FontWeight = System.Windows.FontWeights.Bold,
                            //HorizontalAlignment = System.Windows.HorizontalAlignment.Center,
                            //Foreground = new SolidColorBrush(Colors.White)
                        };
                        wbBG.Render(tb, new TranslateTransform() { X = j * 65, Y = 350 });
                        wbBG.Invalidate();
                    }
                    using (var stream = iso.CreateFile("/Shared/" + i + ".jpg"))
                    {
                        wbBG.SaveJpeg(stream, 480, 800, 0, 85);
                    }
                }
            }
        }