有人可以解释一下为什么以下程序用尽了内存吗?
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] 删除。
我来说两句