在异步加载图片的时候发现的问题,因为要加载很多不同的图片,每次加载一个都要new一个Downloader,结果发现句柄数一直不停地往上冒。后来写了个简单的测试程序,发现每次new一个Downloader,就会增加三个句柄左右,但并不回收。后来改变个方式,重复使用同一个Downloader,发现句柄数在增加一次后就一直不变了。看来和以前说的Silverlight内存回收属于一样的问题,现在就只能使用方法绕过去了,尽量重复使用Downloader,不要new新的Downloader。

比如使用一个Downloader池,一个简单的Downloader Pool应该有两个List和两个方法,两个List分别用来管理工作中的Downloader和空闲的Downloader,一个方法用来提供空闲的Downloader,另外一个方法用来回收已经用完的Downloader。注意,若使用下面的这种代码,需要在回收Downloader时同时去掉Downloader上所附加的托管事件(使用“-=”操作符),你也可以把Downloader的事件封装在这个Downloader Pool类里面~

public class DownloaderPool
{
……
……
private List IdleDownloader = new List();
private List BusyDownloader = new List();
……
……
private DownloaderPool()
{
}

public Downloader GetDownloader()
{
Downloader dler;
if (IdleDownloader.Count > 0)
{
dler = IdleDownloader[0];
IdleDownloader.Remove(dler);
BusyDownloader.Add(dler);
}
else
{
dler = new Downloader();
BusyDownloader.Add(dler);
}

return dler;
}

public void RestoreDownloader(Downloader dler)
{
BusyDownloader.Remove(dler);
if (IdleDownloader.Count < 100)
{
IdleDownloader.Add(dler);
}
}
}

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.