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

質問
-
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)
すべての返信
-
下記で同様の報告があり、SoundPlayer クラスのかわりに waveOut 系 API を使う手法が提案されていました。
- stackoverflow - SoundPlayer causing Memory Leaks?
-
murawさん、こんにちは。フォーラムオペレーターのHarukaです。
MSDNフォーラムにご投稿くださいましてありがとうございます。
私側でテストした結果はメモリリークなしなので、2つの提案があります。
まず、魔界の仮面弁士さんのソリューションを参照して、waveout APIを使用して実行できます。
次に、システムをWindows 1903に更新し、Visual Studioをvs2019に更新できます。
どうぞよろしくお願いいたします。MSDN/ TechNet Community Support Haruka
~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~