当您创建使用IMediaSource在Windows Phone Runtime 8.1中传输音频的后台音频应用程序时,应用程序的组件最终会在某些情况下抛出OutOfMemoryException甚至StackOverflowException.查看内存转储时,里面有很多未收集的垃圾.
讨论已于MSDN forums开始,并取得了这一结论.我已经创建了一个WPDev UserVoice suggestion,以便Windows Phone团队能够注意到这一点,但我仍然希望我(以及来自MSDN论坛的其他人)谁错了并且有解决方案.
我也有一个小的CodePlex project也受此影响,实际上有一个关于这个确切问题的issue report.
我希望在社区的帮助下,这个问题可以解决或直接传递给Microsoft开发团队进行调查和消除.谢谢!
更新1:
有一个kind of workaround for StackOverflowException,但它对OutOfMemoryException没有帮助.
解决方法
为了解决内存问题,请使用Windows运行时的Windows.Storage.Streams.IBuffer.不要以任何形式创建许多新的.NET字节数组,既不是简单的new byte [],也不是使用System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBuffer
类,因为它是IBuffer接口的托管实现.
这些字节数组一旦被分配,由于被OverlappedData结构固定并且溢出后台音频任务的内存阈值而长寿. IBuffers(真正的Windows运行时版本,如Windows.Storage.Streams.Buffer
类)包含一旦IBuffer的引用计数达到0(零)就被释放的本机数组,它们不依赖于GC.
我发现的是这个问题不仅仅是背景音频特有的.实际上,我已经看到很多关于类似问题的其他问题.解决方案是尽可能使用Windows运行时后端,因为它是非托管的,并且只要它们没有引用就释放资源.
感谢@Soonts指出我正确的方向!