在异步加载图片的时候发现的问题,因为要加载很多不同的图片,每次加载一个都要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 ListIdleDownloader = new List ();
private ListBusyDownloader = 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);
}
}
}