gpt4 book ai didi

c# - MediaPlayer 中的内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 19:46:50 25 4
gpt4 key购买 nike

谁能解释一下为什么下面的程序内存不足?

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 接口(interface),因此我不确定是否需要进行其他清理。我当然没有在 MediaPlayer 文档中找到任何内容。

最佳答案

很久以前我有一个应用程序,它把数据渲染成图像,然后把它放在 PictureBox 上,就像图形引擎的管道一样,...

和你的共同点,就是内存力不足,是这样的,...

  • 66%
  • 67%
  • 68%
  • 69%
  • 70%
  • 71%
  • 72%
  • 73%
  • 74%
  • 70% -->自动垃圾收集
  • 71%
  • 72%
  • 73%
  • 74%
  • 75%
  • 76%
  • 77%
  • 78%
  • 79%
  • 80%
  • 81%
  • 77% -->自动垃圾收集
  • 78%
  • 79%
  • >。
  • >。
  • .

还有很多自动垃圾收集在高内存大约 90% 到 97%,...但似乎还不够,在某些时候,大约 97% 和 98% 的系统(应用程序)因内存问题而崩溃...

所以我有了这个想法,每隔几帧调用一次垃圾收集器,所以我这样做了:GC.收集();

GC.Collect it self 太重了,当内存中的对象太多时,......但是当你没有留下太多对象时,它工作顺利,......

还有很多关于终结对象的事情,但我不确定它们是否正常工作,因为它们自然以 -> x = null 结尾

这意味着,我们断开了到那个对象的链接,但这并不意味着我们在银河系周围的某个地方没有这个对象(例如,你可以用一条消息填充对象析构函数,并在离开该对象后看到它不会'不会立即被销毁,直到您关闭应用程序/调用 GC.Collect/内存不足,或者可能是随机自动收集),...直到它被销毁,...所以,例如作为“使用”指令,它自己调用“Dispose”方法,我们用 obj=null 填充我们的 dispose,...然后我不确定我是否应该建议您编写手动 finalize 方法,但还有一件事...有一个 Marshal 对象,我不知道它来自哪里,如果它适用于所有对象,我看到一些程序员用它来释放对象,...,我不知道它是如何工作的,但它可能真的释放了对象从我们的内存中,...

如果您没有发现任何有用的信息,我的第一个选择是调用 GC.Collect...

您还可以设置它的参数,因此它收集的对象比正常情况下少。

https://msdn.microsoft.com/en-us/library/xe0c2357%28v=vs.110%29.aspx

Release resources in .Net C#

我也没有完全阅读,但似乎他有线程和内存问题: Freeing resources when thread is not alive

关于c# - MediaPlayer 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30536301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com