SoudPlayerクラスでのメモリリークについて

Category: visual studio cs_ja

Question

muraw on Thu, 24 Oct 2019 01:53:25


Visual Studio 2015(.Net Frameworkは4.5.2)にて、以下のコードからなる
Windows Formアプリケーション
を作成しています。
button1をクリックしたらTaskを起動し、タスク内で音声再生/停止を繰り返します。


-------------------------------------
using System.Data;
using System.Drawing;
using System.Linq;
using System.Media;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace SoundTest
{
    public partial class Form1 : Form
    {
        private bool flag = false;
        private SoundPlayer player = null;
        private int count = 0;


        public Form1()
        {
            InitializeComponent();
        }


        private void button1_Click(object sender, EventArgs e)
        {
            if(flag == false)
            {
                flag = true;
                Task.Run(()=>Test());
                button1.Text = "stop";
                count = 0;
            }
            else
            {
                flag = false;
                this.Close();
            }
        }


        private void Test()
        {
            while(flag == true)
            {
                if(player != null)
                {
                    player.Stop();
                    player.Dispose();
                    player = null;
                }
                player = new SoundPlayer(@"C:\Windows\Media\tada.wav");
                player.Play();
                Thread.Sleep(5000);
                count++;
            }
        }


        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            MessageBox.Show(count.ToString());
        }
    }
}
-------------------------------------


このアプリケーションを実行するプロセスのメモリ(private bytes)が
右肩上がりで上昇し続け、メモリリークが発生します(数日間動作させ続けても
上昇し続けます)。
何かしら考えられる要因はありますでしょうか。


アプリケーションを実施した環境は以下のとなります。


Windows 10 バージョン 1803(ビルドバージョン:17134.407)
Realtek HD Audio ドライババージョン (10.0.17134.1)

Replies

魔界の仮面弁士 on Thu, 24 Oct 2019 02:09:38


下記で同様の報告があり、SoundPlayer クラスのかわりに waveOut 系 API を使う手法が提案されていました。

muraw on Thu, 24 Oct 2019 03:04:46


ご回答ありがとうございます。

waveOut系APIで試してみます。

Haruka6002 on Thu, 31 Oct 2019 07:32:04


murawさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。

私側でテストした結果はメモリリークなしなので、2つの提案があります。
まず、魔界の仮面弁士さんのソリューションを参照して、waveout APIを使用して実行できます。
次に、システムをWindows 1903に更新し、Visual Studioをvs2019に更新できます。

どうぞよろしくお願いいたします。