2013-07-17 37 views
1

我想在我的winforms应用程序中播放音频。要做到这一点,我用这个:WindowsMediaPlayer(WMPLib)音频突然死亡

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

我使用的WindowsMediaPlayer类,因为在我的音频文件格式为其他类不会播放音频上面的代码工作,直到我添加Process.GetProcesses();Process.GetProcessesByName...到计时器的。滴答事件。

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

第一次计时器滴答声和执行Process.GetProcesses();,音频继续播放。但是,第二次计时器打勾音频停止。如果计时器与播放音频的计时器的形式相同,或者使用不同的计时器,则会发生这种情况。我不知道为什么会发生这种情况。什么导致这个问题?

回答

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"); 
    } 


}