MediaPlayer中的内存泄漏

Sid*_* G. 8 c# multithreading garbage-collection threadpool

有人可以解释为什么以下程序内存不足吗?

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++);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*cke 0

我的猜测是创建的 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,我可以在几秒钟内创建 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 . . .
Run Code Online (Sandbox Code Playgroud)