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

  • 質問

  • 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)

    2019年10月24日 1:53

すべての返信

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

    2019年10月24日 2:09
  • ご回答ありがとうございます。

    waveOut系APIで試してみます。

    2019年10月24日 3:04
  • murawさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

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

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

    MSDN/ TechNet Community Support Haruka
    ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2019年10月31日 7:32
    モデレータ