我正在尝试同时播放多个音频文件,因此我决定使用线程来触发它们(否则只能开始播放直到上一个完成)。
我就是这样做的。
声音是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方法。 随着消息框中弹出消息,目标线程已经以这种方式被杀死。然而,音乐一直在播放。
有没有办法阻止音乐? 提前谢谢!
答案 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