我已经追踪了很远的泄漏,但我自己似乎无法理解(修复)它。我首先使用 ANTS 内存分析器来确保我的代码实际上是在堆叠内存。它从使用 25 MB 开始,但在一个小时左右的时间内使用超过 100 MB。我正在为其编写此代码的朋友实际上一直在使用这个有问题的程序,他用了整个 18 GB 的内存并得到了内存不足的异常。
泄漏部分对程序来说并不重要,但如果没有 RefreshSessions() 方法,它几乎没有用处。
我一直在从 Code Project扩展项目Vista Core Audio API Master Volume Control 。
这是似乎泄漏的部分。通过不使用它进行测试,然后它不会泄漏。
更新:
public void RefreshSessions()
{
Marshal.ThrowExceptionForHR(_AudioSessionManager.GetSessionEnumerator(out _SessionEnum));
_Sessions.Refresh(_SessionEnum);
}
(从这里删除了类代码)
我没有写太多代码,所以我可能遗漏了一些东西,但如果需要更多细节,你可以实际下载源代码,或者我可以尽我所能回答。
(此处删除了不必要的代码)
使用这个简单的控制台应用程序测试了泄漏:
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
MMDeviceEnumerator DevEnum = new MMDeviceEnumerator();
MMDevice device = DevEnum.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia);
Console.ReadKey();
int i = 0;
while (i < 10000)
{
device.AudioSessionManager.RefreshSessions();
i++;
}
Console.ReadKey();
}
}
}
更新 2
我想我把它修好了。必须运行一些更长的测试,但至少看起来内存使用情况已经稳定。这个想法来自 dialer,他找到了 C++ 泄漏的修复方法。
public void RefreshSessions()
{
_Sessions.Release(); //added this
IAudioSessionEnumerator _SessionEnum;
Marshal.ThrowExceptionForHR(_AudioSessionManager.GetSessionEnumerator(out _SessionEnum));
_Sessions.Refresh(_SessionEnum);
}
这是中的部分SessionCollection
:
public void Release()
{
Marshal.ReleaseComObject(_AudioSessionEnumerator);
}
这不完全是建议的代码拨号器(我最终还是使用了它),但仍然如此。正如他所说,这可能不是实现这一目标的最佳方式,但我会继续使用它,因为它似乎对我的应用程序没有任何不利影响。