从内存中卸载/删除vb资源

时间:2013-11-11 18:58:23

标签: vb.net

我对编程非常陌生,并且仍然掌握了许多基础知识。但我已经设法在这里和那里帮助制作了一个完整的程序。但是,我认为我的资源存在内存泄漏问题,我是新的,几乎可以肯定这是一种笨拙的方式来做这件事......

我目前在我的应用程序中有背景音乐,它使用存储在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

1 个答案:

答案 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()调用在前一个音频流上将使您免于麻烦。