停止在线程中播放音乐

时间:2018-02-07 13:45:26

标签: c# multithreading audio

我正在尝试同时播放多个音频文件,因此我决定使用线程来触发它们(否则只能开始播放直到上一个完成)。

我就是这样做的。

声音是SoundPlayers的列表

for (int i = 0; i < sometimes; i++)
{
    SoundPlayer sp = sounds[i];
    Thread thread = new Thread(() =>
    {
        sp.PlayLooping();
    });
    threads.Add(thread);
 }
 foreach (Thread thread in threads)
 {
     thread.Start();
 } 

然后我使用计时器在1秒后停止所有音频文件。

foreach(Thread t in threads)
{
    kill_thread(t);
    MessageBox.Show(t.IsAlive.ToString());
}
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
private void kill_thread(Thread t)
{
   t.Abort();
}

我从here获取了kill_thread方法。 随着消息框中弹出消息,目标线程已经以这种方式被杀死。然而,音乐一直在播放。

有没有办法阻止音乐? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

你不应该杀死任何线程,你或其他人。实际上,你甚至不应该创建线程。正如其他人所说的那样,如果你必须结束一个主题,优雅地结束它,通过Abort进行核实。它可能会使您的进程处于未知状态。

请致电:

soundPlayer.Stop();

MSDN:

  

SoundPlayer.PlayLooping方法

     

在调用Stop方法之前,将播放.wav。 https://msdn.microsoft.com/en-US/library/system.media.soundplayer.playlooping(v=vs.110).aspx

对于并发播放,SoundPlayer并非设计用于精心制作的并发播放(实际上它甚至不会这样做)。您需要使用不同的媒体API。

另见

  • Microsoft DirectShow (自90年代以来一直存在;坚如磐石;媒体服务器和媒体中心的一部分; COM API;虽然没有管理,但很容易从.NET调用COM )

  • Media Foundation (块上的新小孩;也没有托管API)

答案 1 :(得分:0)

这是因为PlayLooping()方法本身启动了一个新线程,因此杀死你的线程不会停止播放器线程。

https://msdn.microsoft.com/it-it/library/system.media.soundplayer.playlooping(v=vs.110).aspx