我对编程非常陌生,并且仍然掌握了许多基础知识。但我已经设法在这里和那里帮助制作了一个完整的程序。但是,我认为我的资源存在内存泄漏问题,我是新的,几乎可以肯定这是一种笨拙的方式来做这件事......
我目前在我的应用程序中有背景音乐,它使用存储在My.Resources中的.wav文件。我已经实现了多项措施来成功启用,禁用和静音,但是当我引入多个音轨时,我遇到了麻烦。这个想法是让最终用户在“设置”中的4首背景歌曲(存储为4个.wav资源)之间进行选择。我的计划领域。当我建立&测试它运行良好的解决方案,一切都按预期。然后,当我将音频更改为设置区域中的其他轨道时,它也可以工作。当我多次更改歌曲时会出现障碍,我收到OutOfMemory错误。
我想我明白发生了什么;每次用户选择资源时,资源都会被添加到内存中,但如果选择-say- song2,我不知道如何从内存中删除-say-song1。这是我处理选择的代码&播放音频。
(该程序使用单选按钮作为'%chkbox' ,并要求用户在运行此代码之前点击“保存”。)使用Visual Basics 2012 .net 4.5
'Save and start songs.
If DjErhain_Mistychkbox.Checked = True Then
My.Settings.AudioDJErhain_UWBeats_Maniac = 0
My.Settings.Save()
My.Settings.AudioDjErhain_Misty = 1
My.Settings.Save()
My.Settings.AudioMachinimaSound_Exigence = 0
My.Settings.Save()
My.Settings.AudioSimplex_Memories_master = 0
My.Settings.Save()
My.Computer.Audio.Play(My.Resources.DjErhain_Misty, AudioPlayMode.BackgroundLoop)
ElseIf DJErhain_UWBeats_Maniacckbox.Checked = True Then
My.Settings.AudioDjErhain_Misty = 0
My.Settings.Save()
My.Settings.AudioDJErhain_UWBeats_Maniac = 1
My.Settings.Save()
My.Settings.AudioMachinimaSound_Exigence = 0
My.Settings.Save()
My.Settings.AudioSimplex_Memories_master = 0
My.Settings.Save()
My.Computer.Audio.Play(My.Resources.DJErhain_UWBeats_Maniac, AudioPlayMode.BackgroundLoop)
ElseIf MachinimaSound_Exigencechckbox.Checked = True Then
My.Settings.AudioMachinimaSound_Exigence = 1
My.Settings.Save()
My.Settings.AudioDJErhain_UWBeats_Maniac = 0
My.Settings.Save()
My.Settings.AudioDjErhain_Misty = 0
My.Settings.Save()
My.Settings.AudioSimplex_Memories_master = 0
My.Settings.Save()
My.Computer.Audio.Play(My.Resources.MachinimaSound_Exigence, AudioPlayMode.BackgroundLoop)
ElseIf Simplex_Memories_masterchckbox.Checked = True Then
My.Settings.AudioSimplex_Memories_master = 1
My.Settings.Save()
My.Settings.AudioDJErhain_UWBeats_Maniac = 0
My.Settings.Save()
My.Settings.AudioDjErhain_Misty = 0
My.Settings.Save()
My.Settings.AudioMachinimaSound_Exigence = 0
My.Settings.Save()
My.Computer.Audio.Play(My.Resources.Simplex_Memories_master, AudioPlayMode.BackgroundLoop)
Else
End If
答案 0 :(得分:1)
是的,这可能会出错,.wav格式不是很紧凑。当您将其放入资源时,使用该资源将创建UnmanagedMemoryStream。它应该在您不再使用它时进行处理,垃圾收集器不会经常运行以避免麻烦。
将新模块添加到项目中并粘贴此代码:
Imports System.IO
Module PlayerUtilities
Private CurrentStream As WeakReference(Of Stream)
Public Sub PlayResource(wave As Stream)
My.Computer.Audio.Play(wave, AudioPlayMode.BackgroundLoop)
Dim oldwave As Stream = Nothing
If CurrentStream IsNot Nothing AndAlso CurrentStream.TryGetTarget(oldwave) Then
oldwave.Dispose()
End If
CurrentStream = New WeakReference(Of Stream)(wave)
End Sub
End Module
用PlayResource()替换你对My.Computer.Audio.Play()的调用。此方法中的Dispose()调用在前一个音频流上将使您免于麻烦。