相关疑难解决方法(0)

C#WPF应用程序使用太多内存而GC.GetTotalMemory()为低

我写了两个线程的WPF应用程序 - 主线程是GUI线程,另一个线程是worker.
App有一个带有一些控件的WPF表单.有一个按钮,允许选择目录.选择目录后,应用程序将扫描该目录中的.jpg文件,并检查其缩略图是否在哈希表中.如果他们是,它什么都不做.否则它将他们的完整文件名添加到工作队列.
Worker正在从这个队列中获取文件名,加载JPEG图像(使用WPF的JpegBitmapDecoder和BitmapFrame),制作它们的缩略图(使用WPF的TransformedBitmap)并将它们添加到哈希表中.
一切正常,除了这个应用程序在为大图像(如5000x5000像素)制作缩略图时的内存消耗.我在表单上添加了文本框以显示内存消耗(GC.GetTotalMemory()和Process.GetCurrentProcess().PrivateMemorySize64)并且非常惊讶,因为GC.GetTotalMemory()保持接近1-2 MB,而私有内存大小不断增长,特别是在加载新图像时(每张图像约+ 100Mb).
即使在加载所有图像,制作它们的缩略图并释放原始图像之后,私有内存大小仍保持在~700-800Mbytes.我的VirtualBox仅限于512Mb的物理内存,VirtualBox中的Windows开始交换很多来处理这种巨大的内存消耗.我想我做错了什么,但我不知道如何调查这个问题,因为根据GC,分配的内存大小非常低.

附加缩略图加载器类的代码:

class ThumbnailLoader
{
    Hashtable thumbnails;
    Queue<string> taskqueue;
    EventWaitHandle wh;
    Thread[] workers;
    bool stop;
    object locker;
    int width, height, processed, added;

    public ThumbnailLoader()
    {
        int workercount,i;
        wh = new AutoResetEvent(false);
        thumbnails = new Hashtable();
        taskqueue = new Queue<string>();
        stop = false;
        locker = new object();
        width = height = 64;
        processed = added = 0;
        workercount = Environment.ProcessorCount;
        workers=new Thread[workercount];
        for (i = 0; i < workercount; i++) {
            workers[i] = …
Run Code Online (Sandbox Code Playgroud)

c# wpf memory-leaks

3
推荐指数
1
解决办法
3558
查看次数

标签 统计

c# ×1

memory-leaks ×1

wpf ×1