1

winforms アプリケーションでオーディオを再生しようとしています。そうするために、私はこれを使用します:

           WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
           string path = "C:\\Windows\\Media\\Ring10.wav";
           wplayer.URL = path;
           wplayer.controls.play();

他のクラスはオーディオ ファイルの形式でオーディオを再生しないため、WindowsMediaPlayer クラスを使用します。上記のコードは、Process.GetProcesses();またはProcess.GetProcessesByName...タイマーの tick イベントに追加するまで機能します。

    private void timer1_Tick(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcesses();
    }

タイマーが初めて作動して を実行するProcess.GetProcesses();と、オーディオは引き続き再生されます。ただし、タイマーが 2 回目でオーディオを停止します。これは、タイマーがオーディオを再生しているものと同じ形式であるか、別の形式である場合に発生します。なぜこれが起こるのか私にはわかりません。この問題の原因は何ですか?

4

1 に答える 1

4

持続する...

       WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
       string path = "C:\\Windows\\Media\\Ring10.wav";
       wplayer.URL = path;
       wplayer.controls.play();

どこかで wplayer への参照を保持していますか? フォームのプライベート フィールドのように?

そうでない場合、ガベージコレクターがランダムに拾って殺すと思います。プロセス リストを取得すると、GC が起動するのに十分な量の一時的なガベージが生成されるのは、おそらく偶然の一致です。

それをに変更してみてください

       private WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

[編集: さらに問題がある場合は、以下の最小限の例を試してください - これはうまくいくはずです:

public partial class Form1 : Form
{
    Timer timer = new Timer();
    private WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

    public Form1()
    {
        InitializeComponent();

        string path = "C:\\Users\\Public\\Music\\Sample Music\\Kalimba.mp3";
        wplayer.URL = path;
        wplayer.controls.play();

        timer.Interval = 2000;
        timer.Tick += timer_Tick;
        timer.Start();
    }

    void timer_Tick(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcesses();
        Debug.WriteLine(processes.Length + " running processes");
    }


}
于 2013-07-17T02:27:36.047 に答える