windows-runtime - Windows Phone 8.1 中的媒体管道是否已损坏?

标签 windows-runtime windows-phone windows-store-apps windows-phone-8.1 background-audio

由于大量内存管理问题,Windows Phone 8.1 中的媒体管道似乎已中断。

在 Windows Phone Runtime 8.1 中创建使用 IMediaSource 流式传输音频的后台音频应用程序时,该应用程序的组件最终会在某些情况下抛出 OutOfMemoryException 甚至 StackOverflowException。查看内存转储时,里面有很多未收集的垃圾。

讨论已开始于 MSDN forums并发展到这个结论。我创建了一个 WPDev UserVoice suggestion为了让 Windows Phone 团队能够注意到这一点,但我仍然希望是我(以及来自 MSDN 论坛的其他人)错了,并且有一个解决方案。

我也有一个小CodePlex project这也受此影响,实际上有一个 issue report有关于这个确切的问题。

我希望在社区的帮助下,这个问题可以得到解决或直接传递给微软开发团队进行调查和消除。谢谢!

更新 1:

有一个 kind of workaround for StackOverflowException ,但它对防止 OutOfMemoryException 没有帮助。

最佳答案

好的,看来问题实际上出在 .NET 中字节数组的生命周期上。

为了解决内存问题,应该使用Windows Runtime的Windows.Storage.Streams.IBuffer .不要以任何形式创建许多新的 .NET 字节数组,也不要通过简单的 new byte[] ,也不通过使用 System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBuffer 类,因为它是 IBuffer 的托管实现界面。

那些字节数组一旦被分配,就会因为被 OverlappedData 固定而存活很长时间。构造并溢出背景音频任务的内存阈值。 IBuffer s(真正的 Windows 运行时对象,如 Windows.Storage.Streams.Buffer 类)包含 native 数组,一旦 IBuffer 就会被释放。的引用计数达到 0(零),它们不依赖于 GC。

我发现这个问题不仅与背景音频有关。其实我已经看到很多关于类似问题的其他问题。解决办法是到使用 Windows 运行时后端 在可能的情况下,因为它是不受管理的,并且一旦它们有零引用就会释放资源。

感谢@Soonts 为我指明了正确的方向!

关于windows-runtime - Windows Phone 8.1 中的媒体管道是否已损坏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25646868/

相关文章:

c# - 在 Windows 应用商店应用程序中无需用户干预即可打印

c# - WIN RT 中是否存在二进制序列化程序?

c# - 如何将文件从本地存储传递到 Windows Phone 8.1 中的库?

javascript - 在 Windows Phone 上禁用双击缩放

c# - 如何解决DEP6500和DEP6701错误?

windows - 将正在运行的 WinStore App 切换到全屏

c# - 通过异步方法调用时,WinRT Metro 应用程序仍然阻塞 UI 线程

c# - Windows Phone 8.1 应用程序中的后台线程

windows-phone - 如何在 Windows Phone 8 中的页面之间传递非字符串参数?

c# - 如何在 Canvas 比例尺内制作多个 Path 元素以适合其父级?