MediaPlayer中的内存泄漏

西德·G。

有人可以解释一下为什么以下程序用尽了内存吗?

class Program
{
    private static void ThreadRoutine()
    {
        System.Windows.Media.MediaPlayer player = new System.Windows.Media.MediaPlayer();
    }

    static void Main(string[] args)
    {
        Thread aThread;
        int iteration = 1;

        while (true)
        {
            aThread = new Thread(ThreadRoutine);
            aThread.Start();
            aThread.Join();

            Console.WriteLine("Iteration: " + iteration++);
        }
    }
}

公平地说,我得到的特定异常是System.ComponentModel.Win32Exception“没有足够的存储空间来处理此命令”。尝试创建新的MediaPlayer时会发生例外。

MediaPlayer没有实现该IDisposable接口,因此我不确定是否需要其他清理。我当然没有在MediaPlayer文档中找到任何内容。

米奇

我的猜测是创建的Thread对象没有及时被垃圾收集。

正如您在评论中指出的那样,您对于寻找一种不涉及内存泄漏的解决方案感到不走运,因此,尽管它没有尝试回答您的原始问题,但我仍将其作为答案发布。

如果改用ThreadPool,则(a)运行速度快得多(b)不会崩溃。

class Program
{
    private static void ThreadRoutine(object state)
    {
        var player = new MediaPlayer();

        var iteration = (int)state;
        if (iteration % 1000 == 0)
        {
            Console.WriteLine("Executed: " + state);
        }
    }

    static void Main(string[] args)
    {
        for (int i = 0; i < 10000000; i++)
        {
            if (i % 1000 == 0)
            {
                Console.WriteLine("Queued: " + i);
            }

            ThreadPool.QueueUserWorkItem(ThreadRoutine, i);
        }
    }
}

在我的机器上,我可以在几秒钟内创建1000万个线程池线程。

Queued: 9988000
Queued: 9989000
Queued: 9990000
Queued: 9991000
Executed: 9989000
Executed: 9990000
Executed: 9991000
Executed: 9988000
Queued: 9992000
Executed: 9992000
Queued: 9993000
Queued: 9994000
Queued: 9995000
Executed: 9994000
Executed: 9993000
Queued: 9996000
Executed: 9996000
Executed: 9995000
Queued: 9997000
Executed: 9997000
Queued: 9998000
Executed: 9998000
Queued: 9999000
Executed: 9999000
Press any key to continue . . .

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章