我们有一个带有ActiveX ShockwaveFlashObject控件的C#/。NET 2.0 WinForm。程序循环播放内容计划并在控件上反复显示,全屏,如下所示:
axFlash.BringToFront();
axFlash.Movie = scheduleItem.FilePath;
axFlash.Show();
axFlash.Play();
这很好用,但运行几天后,Flash ActiveX控件所在的表单将抛出这样的异常:
System.Runtime.InteropServices.SEHException: External component has thrown an exception.
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.AxHost.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
查看任务管理器,我发现我们的程序几乎已经分配了机器上的所有可用内存。 (〜500MB)
答案 0 :(得分:2)
ActiveX组件通常用非托管代码编写,因此不会被CLR垃圾收集器清理。您需要确保释放对ActiveX控件的任何引用。我认为这只会产生一个问题,但是如果你要重新创建ActiveX控件那么多。
您可以使用perfmon来衡量CLR的内存使用情况和整体内存使用情况。您可以使用它来缩小泄漏内存的人的范围。 (差异可能是由于非托管代码,如activex控件)
如果您确实将其与ActiveX或Flash控件隔离,请尝试使用不占用内存的虚假对象来删除这些对象。这应该让你验证它是泄漏的来源。
答案 1 :(得分:0)
如果C#应用程序中的代码过于简单,我建议您只在AIR中编写代码。这样您就不会处理ActiveX和Flash的OCX可能存在的任何错误。
答案 2 :(得分:0)
只有托管代码被垃圾回收。 ActiveX代码使用标准的COM样式集合(AddRef / ReleaseRef)。使用com引用完成后,将其设置为null只是为了安全,或者在它周围包装using()。
答案 3 :(得分:0)
这可能有点晚了,但这是我的5美分:
我认为.swf(正在播放的闪存)导致内存泄漏,我在前一段时间遇到过Flash问题,解决方法是仔细检查代码并正确停止/清除所有定时器处理所有使用的对象等我正在使用processXP进行调试,以查看闪存如何管理内存,以及是否有错误的编码习惯(不删除EventListeners,不停止计时器,创建新实例并在没有正确处理它们的情况下停止使用它们) ,及时达到内存限制和崩溃。 (无论你在哪里拥有闪存,在浏览器中,独立,在活动中等都会发生崩溃)。
如果你是.swf的创建者,你可以更加注意它,你不必重新启动你的程序,但是如果你从其他来源获得它,你将不得不定期关闭它,因为你不知道里面的编码有多好。