Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WindowsMediaPlayer(WMPLib)音频突然消失_C#_Winforms_Audio_Process_Timer - Fatal编程技术网

C# WindowsMediaPlayer(WMPLib)音频突然消失

C# WindowsMediaPlayer(WMPLib)音频突然消失,c#,winforms,audio,process,timer,C#,Winforms,Audio,Process,Timer,我正在尝试在winforms应用程序中播放音频。为此,我使用以下方法: WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer(); string path = "C:\\Windows\\Media\\Ring10.wav"; wplayer.URL = path; wplayer.controls.play(); 我使用Wind

我正在尝试在winforms应用程序中播放音频。为此,我使用以下方法:

           WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
           string path = "C:\\Windows\\Media\\Ring10.wav";
           wplayer.URL = path;
           wplayer.controls.play();
我使用WindowsMediaPlayer类是因为其他类不会以我的音频文件的格式播放音频。上面的代码在我添加
Process.GetProcesses()之前一直有效
Process.getProcessByName…
到计时器的勾号事件

    private void timer1_Tick(object sender, EventArgs e)
    {
        Process[] processes = Process.GetProcesses();
    }
计时器第一次计时并执行
Process.GetProcesses(),音频将继续播放。但是,计时器第二次滴答声时,音频停止。如果计时器与播放音频的计时器形式相同或不同,则会发生这种情况。我不知道为什么会这样。导致此问题的原因是什么?

请稍候

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


}
等一下

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


}