none
Bitmap疑问两则 RRS feed

  • 问题

  •  

    问题1:

    ----------------------------------------------------------------

          for (int i = 0; i < 10000; i++)
          {
            BitmapImage bmp = new BitmapImage(new Uri("/Images/Icon/1/0/0_0.png", UriKind.Relative));


            bmp = null;

            GC.Collect();
          }

    执行以上代码会发现,SL宿主浏览器使用的内存持续上升,无法释放???

     

    问题2.

    ---------------------------------------------------------------

            BitmapImage bmp = new BitmapImage(new Uri("/Images/Icon/1/0/0_0.png", UriKind.Relative));

            Image img = new Image();
            img.Source = bmp;
            this.LayoutRoot.Children.Add(img);

     

            Image img2 = new Image();
            img2.Source = bmp;                 -------------------------------->出错!!!
            this.LayoutRoot.Children.Add(img2);

     

    一个bitmap对象,只能使用一次??

    2008年9月22日 14:19

答案

  •  

    1.垃圾回收的方法如下:

    ThreadPool.QueueUserWorkItem(delegate(object ob)
          {
            //如果需要修改UI元素请写在这之前
            Thread.Sleep(10 * 1000);
            GC.Collect();
    
          });
    


     

    2.现在Silverlight4是可以两个Image共用一个Source.

    前台代码:

    <UserControl x:Class="SilverlightApplication3.BitmapTest"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      d:DesignHeight="300" d:DesignWidth="400">
    
      <Canvas x:Name="myCanvas" Background="White" Width="500">
    
      </Canvas>
    </UserControl>
    
    


     

    后台代码:

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.Threading;
    
    namespace SilverlightApplication3
    {
      public partial class BitmapTest : UserControl
      {
        public BitmapTest()
        {
          InitializeComponent();
          this.Loaded += new RoutedEventHandler(BitmapTest_Loaded);
        }
    
        void BitmapTest_Loaded(object sender, RoutedEventArgs e)
        {
          var bitmap = new BitmapImage(new Uri("1.jpg", UriKind.Relative));
          Image image = new Image();
          image.Source = bitmap;
          image.Width = 200;
          image.Height = 200;
          myCanvas.Children.Add(image);
          Canvas.SetLeft(image, 0);
    
    
          Image image2 = new Image();
          image2.Source = bitmap;
          image2.Width = 200;
          image2.Height = 200;
          myCanvas.Children.Add(image2);
          Canvas.SetLeft(image2, 100);
          //ThreadPool.QueueUserWorkItem(delegate(object ob)
          //{
          //  //如果需要修改UI元素请写在这之前
          //  Thread.Sleep(10 * 1000);
          //  GC.Collect();
    
          //});
        }
      }
    }
    


     


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年7月12日 6:10
    版主

全部回复

  •  

    1.垃圾回收的方法如下:

    ThreadPool.QueueUserWorkItem(delegate(object ob)
          {
            //如果需要修改UI元素请写在这之前
            Thread.Sleep(10 * 1000);
            GC.Collect();
    
          });
    


     

    2.现在Silverlight4是可以两个Image共用一个Source.

    前台代码:

    <UserControl x:Class="SilverlightApplication3.BitmapTest"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d"
      d:DesignHeight="300" d:DesignWidth="400">
    
      <Canvas x:Name="myCanvas" Background="White" Width="500">
    
      </Canvas>
    </UserControl>
    
    


     

    后台代码:

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Media.Imaging;
    using System.Threading;
    
    namespace SilverlightApplication3
    {
      public partial class BitmapTest : UserControl
      {
        public BitmapTest()
        {
          InitializeComponent();
          this.Loaded += new RoutedEventHandler(BitmapTest_Loaded);
        }
    
        void BitmapTest_Loaded(object sender, RoutedEventArgs e)
        {
          var bitmap = new BitmapImage(new Uri("1.jpg", UriKind.Relative));
          Image image = new Image();
          image.Source = bitmap;
          image.Width = 200;
          image.Height = 200;
          myCanvas.Children.Add(image);
          Canvas.SetLeft(image, 0);
    
    
          Image image2 = new Image();
          image2.Source = bitmap;
          image2.Width = 200;
          image2.Height = 200;
          myCanvas.Children.Add(image2);
          Canvas.SetLeft(image2, 100);
          //ThreadPool.QueueUserWorkItem(delegate(object ob)
          //{
          //  //如果需要修改UI元素请写在这之前
          //  Thread.Sleep(10 * 1000);
          //  GC.Collect();
    
          //});
        }
      }
    }
    


     


    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年7月12日 6:10
    版主
  • 我尽力用心回答你的问题,因为问题是2008年提出的,所以我冒昧的把自己的答案标记为正确
    努力!完成了js解析器,还差一个svg插件,一个绘图程序,做好自己,呵呵~!
    2011年7月12日 6:11
    版主